在您的“我的代码”代码段中,可能存在一些问题:
- 发生异常时,没有
finally
阻止关闭会话的块 - 您正在打电话
session.close()
,但这与有所不同HibernateUtils.closeSession()
。因此,ThreadLocal
不会清除。 - 没有
catch
例外。结果是没有rollback
。 - 您是抛出异常还是被(静默)忽略?
如果之后的“待办事项”块中有异常
begin(),则事务保持打开状态,并且
ThreadLocal不清除。
您的代码可能正常工作,但是在高负载下可能会发生(SQL锁定)超时等情况,在这种情况下,偶尔会抛出异常。
因此,请检查 每个 代码段以进行 正确的 异常处理:
final Session session = HibernateUtil.getSession();try { final Transaction transaction = session.beginTransaction(); try { // The real work is here transaction.commit(); } catch (Exception ex) { // Log the exception here transaction.rollback(); throw ex; }} finally { HibernatilUtil.closeSession();}您可以向
HibernateUtil.getSession()和添加一些“簿记”代码
HibernateUtil.closeSession():记录每次访问,包括线程的名称。最终,同一线程必须进行一次或多次“获取”,然后再进行“关闭”。
在您的情况下,我什至会考虑只有一个“ get”,并且只要您的线程正在执行其工作单元,就传递该会话:这样一来,发现问题可能会更容易。
关于SO的另一个问题报告了类似的问题:Hibernate4.1.9(最新的最终构建)报告了不支持嵌套事务。
您可以在
commit()检查之后添加一些代码,以确认交易是否真的完成了(通过调用
wasCommitted())。
Javadoc中的引文
wasCommitted():
即使成功调用commit(),此方法也可能返回false。例如,如果基于JTA的策略没有启动事务,则它们对no(op)的调用不执行操作。在这种情况下,他们还报告wasCommitted()为假。



