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