Tag: 打开会话在视图中

在Spring MVC中使用ScrollableResults-backed Stream作为返回types时遇到困难

重要提示:这已被作为4.1.2的目标修复版本的Spring问题接受。 我的目标是在从Hibernate的ScrollableResults生成HTTP响应时实现O(1)空间复杂性。 我想保留一个MessageConverter分派的标准机制来处理从@Controller返回的对象。 我已经设置了以下内容: MappingJackson2HttpMessageConverter了一个处理Java 8 Stream的JsonSerializer ; ScrollableResultSpliterator需要将ScrollableResults封装到Stream ; OpenSessionInViewInterceptor需要保持Hibernate会话在MessageConverter打开; 设置hibernate.connection.release_mode为ON_CLOSE ; 确保JDBC连接具有必需的ResultSet可保存性: con.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT) 。 另外,我需要一个支持这种可保存性的数据库。 PostgreSQL是这样一个数据库,我没有这个问题。 我遇到的最后一个绊脚石是HibernateTransactionManager对事务提交使用的策略:除非底层会话是“Hibernate-managed”,否则它将disconnect() ,closures我的游标以及所有其他事物。 这种政策在一些特殊情况下是有用的,特别是“对话范围内的会议”,这远远不符合我的要求。 我设法解决了这个问题:我不得不用一个方法覆盖违规的方法,除了删除的disconnect()调用之外,它实际上是一个原始的复制粘贴,但是它必须通过reflection来访问private API。 public class NoDisconnectHibernateTransactionManager extends HibernateTransactionManager { private static final Logger logger = LoggerFactory.getLogger(NoDisconnectHibernateTransactionManager.class); public NoDisconnectHibernateTransactionManager(SessionFactory sf) { super(sf); } @Override protected void doCleanupAfterCompletion(Object transaction) { final JdbcTransactionObjectSupport txObject = (JdbcTransactionObjectSupport) transaction; final […]