gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:29:51 27 4
gpt4 key购买 nike

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

似乎最终发生的是代码通常只要不使用 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-Servlet-MySql 5.1.63- hibernate/C3P0 4.1.4.Final- jetty

最佳答案

是的,我想。

如果不开启事务就开始查询,底层会自动开启这个事务。此连接与打开的事务将返回到连接池并提供给另一个用户,该用户将接收到已打开事务的连接,这可能会导致不一致的状态。

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

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

关于java - 在不启动事务的情况下通过 Hibernate 对 MySQL 数据库运行查询的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11313792/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com