在不启动事务的情况下通过Hibernate运行MySQL数据库查询的含义是什么?

时间:2012-07-03 15:03:54

标签: java mysql hibernate jdbc guice-persist

在我看来,我们有一些代码尚未启动事务尚未进行只读操作,我们通过JPA / Hibernate查询以及直接SQL似乎都有效。我们的框架会打开一个hibernate / jpa会话,但是遗留代码中的一些地方我们发现没有打开任何事务。

似乎最终发生的事情是代码通常会运行,只要它不使用EntityManager.persist和EntityManager.merge。但是,偶尔(可能是1/10)次,servlet容器因此错误而失败...

Failed to load resource: the server responded with a status of 500 (org.hibernate.exception.JDBCConnectionException: The last packet successfully received from the server was 314,024,057 milliseconds ago.  The last packet sent successfully to the server was 314,024,057 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.) 

据我所知,只有我们的应用程序代码中没有在查询之前启动事务的几个位置会出现此问题。是否有人认为可能是非事务性查询正在运行导致此行为?

这里是我们的堆栈......

-Guice -Guice,坚持 -Guice小服务程序 -MySql 5.1.63 -Hibernate / C3P0 4.1.4.Final -Jetty

1 个答案:

答案 0 :(得分:0)

是的,我想。

如果在未打开事务的情况下启动查询,则此事务将由底层图层自动打开。具有已打开事务的此连接将返回到连接池并提供给另一个用户,该用户将接收与已打开事务的连接,这可能导致状态不一致。

在我的公司里,我们在过去遇到了很多问题,只读非事务性查询,并调整了我们的框架来处理这个问题。 除此之外,我们与BoneCP开发人员进行了交谈,他们接受了开发一组功能来帮助解决这个问题,比如返回池中的自动回滚未提交事务,以及打印忘记提交事务的方法的堆栈跟踪。

这个问题在这里讨论: http://jolbox.com/forum/viewtopic.php?f=3&t=98