Hibernate ScrollableResult 不适用于 Springboot 3.2

问题描述 投票:0回答:1

在 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]

我尝试以多种方式修改查询,添加事务或锁定模式,但没有任何效果。在某种程度上,在我开始滚动结果之前,有人关闭了连接。

有人可以帮助我吗?

spring-boot hibernate scrollableresults
1个回答
0
投票

我们有同样的问题。经过多次 debug ant 测试,我们发现我们的 EntityManager 没有加入 Transaction。

em.isJoinedToTransaction() == false

直到 Spring-Boot 3.1.6 版本,尽管 ScrollableResults 仍然有效。但从 3.1.7 开始 Hibernate Session 被关闭了。在我们正确配置 @Transactional 属性后,ScrollableResults 就可以工作了。我希望它有帮助

© www.soinside.com 2019 - 2024. All rights reserved.