如何中断休眠会话?
在Hibernate引用中,多次指出
Hibernate 引发的所有异常都是致命的。这意味着您必须回滚数据库事务并关闭当前 .不允许你继续使用引发异常的 。
Session
Session
我们的一个旧版应用程序使用单个会话将文件中的许多记录更新/插入到数据库表中。每个记录更新/插入都在单独的事务中完成,然后提交该事务(或在发生错误时回滚)。然后,对于下一条记录,将打开一个新事务,依此类推。但是,在整个过程中使用相同的会话,即使 a 在处理过程中被捕获。我们在 JBoss 4.2 上使用 Oracle 9i btw 和 Hibernate 3.24.sp1。HibernateException
读了书中的上述内容,我意识到这个设计可能会失败。因此,我重构了应用程序,以便对每个记录更新使用单独的会话。在具有模拟会话工厂的单元测试中,我可以验证它现在是否正在为每个记录更新请求一个新会话。目前为止,一切都好。
但是,我们发现在测试整个应用程序时无法重现会话失败(顺便说一句,这是压力测试还是...?)。我们考虑关闭数据库的侦听器,但我们意识到该应用程序使一堆连接对数据库保持开放,并且侦听器不会影响这些连接。(这是一个Web应用程序,每晚由调度程序激活一次,但也可以通过浏览器激活。然后,我们试图在应用程序处理更新时终止数据库中的一些连接 - 这导致一些失败的更新,但随后应用程序高兴地继续更新其余记录。显然,Hibernate足够聪明,可以在引擎盖下重新打开断开的连接,而不会破坏整个会话。
因此,这可能不是一个关键问题,因为我们的应用程序即使在其原始形式下似乎也足够强大。但是,这个问题一直困扰着我。我想知道:
- 在什么情况下,在抛出 后,休眠会话真的变得不可用(更新:以及症状是什么)?
HibernateException
- 如何在测试中重现这一点(更新:最好是在集成中,而不是单元测试中)?
- (这种测试的正确术语是什么?