spring-data-dynamodb
spring-data-dynamodb copied to clipboard
too many requests to amazon API
Expected Behavior
A single request (or an appropriate number) should be made
Actual Behavior
A single call to findAll with a limit of 20 is loading the whole data set
Steps to Reproduce the Problem
- Create a repo
- Create a Bean and map it to whatever table (preferably with a large number of rows)
- make a call to findAll with a limit of say 10, and notice how the log shows a large number of requests.
Specifications
- Spring Data DynamoDB Version: 5.1.0
- Spring Data Version: 2.0.13.RELEASE
- AWS SDK Version: 1.11.438
- Java Version: 1.8.0_181
- Platform Details: Ubuntu 18.04 LST
I tried to trace the problem and it seems a call to PaginatedScanList#size is causing this, isn't it possible to run two queries, one with count(*) and the actual query to get both the size and the needed data?
I traced the code further and it seems there are two main problems:
- in
src/main/java/org/socialsignin/spring/data/dynamodb/repository/support/SimpleDynamoDBPagingAndSortingRepository.java
there is a call toscan
function from the aws sdk which scans the whole table rather than scanning within the requested limit, changing this to scanPage fixes one half of the issue - In
src/main/java/org/socialsignin/spring/data/dynamodb/core/DynamoDBTemplate.java#count
what actually happens is that the limit limits the number of counted rows (personally i think this is a flow in the amazon sdk), setting the limit tonull
dramatically drops the number of calls
I would be happy to submit a pull request if everybody is fine with the changes.
Use the Query(limit=blah) annotation.
https://github.com/derjust/spring-data-dynamodb/pull/239
It's in 5.1.1-SNAPSHOT