0

システムのすべてのユーザーをメモリにロードするために ScrollableCursor を使用しようとしています。私はこのようなコードを持っています:

    Query findUsersQuery
            = entityManager.createNamedQuery(UserEntity.QUERY_ALL_USERS, UserEntity.class);
    findUsersQuery.setHint(QueryHints.SCROLLABLE_CURSOR, Boolean.TRUE);
    findUsersQuery.setHint(QueryHints.CURSOR_PAGE_SIZE, bulkSize);
    findUsersQuery.setMaxResults(maxInitialCacheSize);

    ScrollableCursor scrollableCursor = (ScrollableCursor) findUsersQuery.getSingleResult();
    int leftSize = scrollableCursor.size();
    while (scrollableCursor.hasNext()) {

        int nextSize = leftSize > bulkSize ? bulkSize : leftSize;
        List subscriberPrefs = scrollableCursor.next(nextSize);
        leftSize -= nextSize;
        //... Result list processing

    }

クエリは次のとおりです。SELECT s FROM UserEntity u order by u.userId

scrollableCursor.next(nextSize); の場合、結果テーブルのサイズは 100 です。呼び出され、次の例外が発生します。

org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLRecoverableException: Closed Resultset
Error Code: 17010
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.cursorRetrieveNextRow(DatabaseAccessor.java:447)[215:org.eclipse.persistence.core:2.4.1.v20121003-ad44345]
    at org.eclipse.persistence.queries.ScrollableCursor.retrieveNextObject(ScrollableCursor.java:563)[215:org.eclipse.persistence.core:2.4.1.v20121003-ad44345]
    at org.eclipse.persistence.queries.ScrollableCursor.loadNext(ScrollableCursor.java:411)[215:org.eclipse.persistence.core:2.4.1.v20121003-ad44345]
    at org.eclipse.persistence.queries.ScrollableCursor.next(ScrollableCursor.java:437)[215:org.eclipse.persistence.core:2.4.1.v20121003-ad44345]
    at org.eclipse.persistence.queries.ScrollableCursor.next(ScrollableCursor.java:459)[215:org.eclipse.persistence.core:2.4.1.v20121003-ad44345]

next(10) を呼び出すと、最初の行が正常にロードされ、2 行目に例外が発生します。理由がわかりません。このエラーを回避する方法を教えてください。

4

0 に答える 0