Jpa Eclipselink ScrollableCursor在第二次调用next()时失败
我试图使用ScrollableCursor将系统的所有用户加载到内存中。 我有这样一个代码:Jpa Eclipselink ScrollableCursor在第二次调用next()时失败,jpa,eclipselink,scrollableresults,Jpa,Eclipselink,Scrollableresults,我试图使用ScrollableCursor将系统的所有用户加载到内存中。 我有这样一个代码: Query findUsersQuery = entityManager.createNamedQuery(UserEntity.QUERY_ALL_USERS, UserEntity.class); findUsersQuery.setHint(QueryHints.SCROLLABLE_CURSOR, Boolean.TRUE); findUsersQ
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
}
查询为:按用户ID从用户实体u订单中选择s
当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)时,第一行正常加载,第二行出现异常。我不知道为什么。有人能告诉我如何避免这个错误吗?这是一个容器管理的持久性单元吗?如果是,请尝试将其包装到事务中。是否在同一个“http请求”中调用next()?否则,您的容器可能会关闭DB连接(以及结果集),我称之为scrollableCursor.next(nextSize),它会在循环中调用next()。将所有结果集处理合并到一个方法中。此操作在单个事务内完成。