【发布时间】:2014-05-09 05:46:01
【问题描述】:
我必须保留在@Transactional Controller 中打开的ResultSet,以便在MessageConverter 中使用。为此,我配置了以下内容:
-
MVC 拦截器:
<mvc:interceptors> <bean class="org.springframework.orm.hibernate4.support.OpenSessionInViewInterceptor" p:sessionFactory-ref="sessionFactory"/> </mvc:interceptors> -
在 SessionFactory bean 上:
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" <property name="hibernateProperties"> <props> <prop key="hibernate.connection.release_mode">on_close</prop> .... </props> </property> </bean> -
在Controller方法内:
session.doWork((con) -> { con.setHoldability(HOLD_CURSORS_OVER_COMMIT); });
但PSQLException: This ResultSet is closed. 仍然存在。这是在控制器方法返回时事务提交时日志中的相关 sn-p:
TRACE o.h.e.j.i.JdbcCoordinatorImpl - Registering result set [org.apache.tomcat.dbcp.dbcp2.DelegatingResultSet@5a63c2aa]
DEBUG o.h.e.t.s.AbstractTransactionImpl - committing
TRACE o.h.internal.SessionImpl - Automatically flushing session
TRACE o.h.internal.SessionImpl - before transaction completion
DEBUG o.h.e.t.i.j.JdbcTransaction - committed JDBC Connection
DEBUG o.h.e.t.i.j.JdbcTransaction - re-enabling autocommit
TRACE o.h.e.t.i.TransactionCoordinatorImpl - after transaction completion
TRACE o.h.internal.SessionImpl - after transaction completion
TRACE o.h.internal.SessionImpl - Setting flush mode to: MANUAL
DEBUG o.h.internal.SessionImpl - Disconnecting session
TRACE o.h.e.j.i.JdbcCoordinatorImpl - Releasing JDBC container resources [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl@97bfa5f]
TRACE o.h.e.j.i.JdbcCoordinatorImpl - Closing result set [org.apache.tomcat.dbcp.dbcp2.DelegatingResultSet@5a63c2aa]
TRACE o.h.e.j.i.JdbcCoordinatorImpl - Closing prepared statement [select...]
DEBUG o.h.e.j.i.LogicalConnectionImpl - Releasing JDBC connection
DEBUG o.h.e.j.i.LogicalConnectionImpl - Released JDBC connection
DEBUG o.h.e.j.s.SqlExceptionHelper - could not advance using next() [n/a] org.postgresql.util.PSQLException: This ResultSet is closed.
我还能做些什么来阻止这种情况发生吗?
【问题讨论】:
-
资源是否实际映射到 OSIV 过滤器中?其他一切看起来都不错。
-
我在拦截器配置中有
<mvc:mapping path="/resource-path"/>,但没有显示出来,因为没有映射它普遍适用。此外,这部分可以证明是有效的,因为如果我不使用 @Transactional,我会得到我的开放结果集。
标签: java spring hibernate spring-mvc hibernate-4.x