在 springboot 应用程序中,我使用可滚动结果来进行查询,以这种方式
Session session = entityManager.unwrap(Session.class); org.hibernate.query.Query query = buildParameterizedQuery(); /*this is some method that build a query*/ ScrollableResults result = query.setReadOnly(true).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY);
这在 springboot 3.1 上运行良好。我尝试迁移到springboot 3.2。然后我的应用程序崩溃了。当我第一次打电话时
result.next();
引发异常
java.lang.IllegalStateException: org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl@4e212c5c is closed
at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.errorIfClosed(AbstractLogicalConnectionImplementor.java:37) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:142) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:54) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:153) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:183) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:155) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.lambda$scroll$1(JdbcSelectExecutor.java:102) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:231) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.getResultSet(DeferredResultSetAccess.java:167) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.advanceNext(JdbcValuesResultSetImpl.java:218) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:98) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues.next(AbstractJdbcValues.java:19) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:66) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
at org.hibernate.internal.ScrollableResultsImpl.next(ScrollableResultsImpl.java:51) ~[hibernate-core-6.4.2.Final.jar!/:6.4.2.Final]
我尝试以多种方式修改查询,添加事务或锁定模式,但没有任何效果。在某种程度上,在我开始滚动结果之前,有人关闭了连接。
有人可以帮助我吗?
我们有同样的问题。经过多次 debug ant 测试,我们发现我们的 EntityManager 没有加入 Transaction。
em.isJoinedToTransaction() == false
直到 Spring-Boot 3.1.6 版本,尽管 ScrollableResults 仍然有效。但从 3.1.7 开始 Hibernate Session 被关闭了。在我们正确配置 @Transactional 属性后,ScrollableResults 就可以工作了。我希望它有帮助