doraemon
doraemon

Reputation: 403

Is there a bug with Pageable, PageRequest in Spring Data JPA or JdkDynamicAopProxy in Spring?

The following integration test method testLocalPaging uses an HSQL in-memory database with 100 entries in Stock table. The repository class is implemented using Spring Data JPA, which is simply an interface extending PagingAndSortingRepository. However, the test will "freeze" at the sixth page when the number of pages is set to be around 15 or below. I realize the test will stuck after reading about 6 pages from the database. However, if I use a larger page size, for example, 20, the test run just fine with all 100 entries read from the database after five pages without issue. I was wondering if there is a bug with Spring Data JPA somewhere? I notice the line that causes the problem is in line 202 of org.springframework.aop.framework.JdkDynamicAopProxy. I'm using spring-data-jpa-1.4.1.RELEASE, spring-aop-3.1.4.RELEASE and hibernate-core-3.6.10.Final, etc. Can someone please point out if there's something wrong in my test or something wrong in Spring or Hibernate? I am quite confused by the test result.

StockDaoJpa:

import org.springframework.data.repository.PagingAndSortingRepository;

public interface StockDaoJpa extends PagingAndSortingRepository<Stock, Long>{
}

Test method:

@Test
public void testLocalPaging()
{
    log.info("testLocalPaging()...");
    int size = 10;
    Page<Stock> page = null;
    Pageable request = new PageRequest(0, size, new Sort(new Order("StockId")));
    do
    {
        if(page == null)
            page = stockRepository.findAll(request);
        else
        {
            request = page.nextPageable();
            log.info(request);
            //TODO: It freezes at the sixth request whatever the pagesize is.
            page = stockRepository.findAll(request);
        }
        log.info(page);
        for(Stock s : page)
            log.info(String.format("Id = %s", s.getStockId()));
        log.info(page.hasNextPage());
    } while(page.hasNextPage());
}

Code in JdkDynamicAopProxy class which the test stuck at:

...
            else {
                // We need to create a method invocation...
                invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
                // Proceed to the joinpoint through the interceptor chain.
                retVal = invocation.proceed();
            }
...

Out put from testLocalPaing:

[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    63 | testLocalPaging()...
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    78 | Page 0 of 10 containing jstat.sample.Stock instances
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    80 | Id = 1
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    80 | Id = 2
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    80 | Id = 3
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    80 | Id = 4
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    80 | Id = 5
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    80 | Id = 6
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    80 | Id = 7
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    80 | Id = 8
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    80 | Id = 9
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    80 | Id = 10
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    81 | true
[INFO ] | 20:38:22 | [mainhread] |           ConfigTest    74 | Page request [number: 1, size 10, sort: StockId: ASC]
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    78 | Page 1 of 10 containing jstat.sample.Stock instances
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    80 | Id = 11
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    80 | Id = 12
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    80 | Id = 13
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    80 | Id = 14
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    80 | Id = 15
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    80 | Id = 16
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    80 | Id = 17
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    80 | Id = 18
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    80 | Id = 19
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    80 | Id = 20
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    81 | true
[INFO ] | 20:38:26 | [mainhread] |           ConfigTest    74 | Page request [number: 2, size 10, sort: StockId: ASC]
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    78 | Page 2 of 10 containing jstat.sample.Stock instances
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    80 | Id = 21
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    80 | Id = 22
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    80 | Id = 23
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    80 | Id = 24
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    80 | Id = 25
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    80 | Id = 26
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    80 | Id = 27
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    80 | Id = 28
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    80 | Id = 29
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    80 | Id = 30
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    81 | true
[INFO ] | 20:38:28 | [mainhread] |           ConfigTest    74 | Page request [number: 3, size 10, sort: StockId: ASC]
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    78 | Page 3 of 10 containing jstat.sample.Stock instances
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    80 | Id = 31
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    80 | Id = 32
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    80 | Id = 33
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    80 | Id = 34
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    80 | Id = 35
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    80 | Id = 36
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    80 | Id = 37
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    80 | Id = 38
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    80 | Id = 39
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    80 | Id = 40
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    81 | true
[INFO ] | 20:38:29 | [mainhread] |           ConfigTest    74 | Page request [number: 4, size 10, sort: StockId: ASC]
[INFO ] | 20:39:09 | [mainhread] |           ConfigTest    78 | Page 4 of 10 containing jstat.sample.Stock instances
[INFO ] | 20:39:10 | [mainhread] |           ConfigTest    80 | Id = 41
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    80 | Id = 42
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    80 | Id = 43
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    80 | Id = 44
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    80 | Id = 45
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    80 | Id = 46
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    80 | Id = 47
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    80 | Id = 48
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    80 | Id = 49
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    80 | Id = 50
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    81 | true
[INFO ] | 20:39:12 | [mainhread] |           ConfigTest    74 | Page request [number: 5, size 10, sort: StockId: ASC]
[INFO ] | 20:39:31 | [mainhread] |           ConfigTest    78 | Page 5 of 10 containing jstat.sample.Stock instances
[INFO ] | 20:39:35 | [mainhread] |           ConfigTest    80 | Id = 51
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    80 | Id = 52
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    80 | Id = 53
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    80 | Id = 54
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    80 | Id = 55
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    80 | Id = 56
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    80 | Id = 57
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    80 | Id = 58
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    80 | Id = 59
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    80 | Id = 60
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    81 | true
[INFO ] | 20:39:38 | [mainhread] |           ConfigTest    74 | Page request [number: 6, size 10, sort: StockId: ASC]

Upvotes: 1

Views: 3781

Answers (1)

doraemon
doraemon

Reputation: 403

It turns out that hibernate-core-3.6.10.Final with spring-data-jpa-1.4.1.RELEASE is causing the problem. I changed to hibernate-core-4.2.7.Final and the problem automatically disappeared.

Upvotes: 1

Related Questions