2012-07-03 62 views
1

在我看來,我們有一些代碼沒有爲只讀操作啓動事務,但我們通過JPA/Hibernate進行的查詢以及直接SQL似乎都有效。我們的框架會打開一個hibernate/jpa會話,但對於遺留代碼中的一些點,我們發現沒有事務正在打開。在不啓動事務的情況下通過Hibernate對MySQL數據庫運行查詢有什麼含義?

什麼似乎最終發生的是,代碼通常運行,只要它不使用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.) 

至於我可以告訴只有在我們的應用程序代碼的幾個景點,沒有交易前開始查詢將會產生這個問題。其他人是否認爲這可能是導致此行爲的非事務性查詢運行?

FYI這裏是我們的堆棧...

-Guice -Guice,堅持 -Guice小服務程序 -MySql 63年5月1日 -HIBERNATE/C3P0 4.1.4.Final -Jetty

回答

0

是的,我想。

如果您在未打開事務的情況下啓動查詢,則此事務將由底層自動打開。此連接與打開的事務將被返回到連接池並提供給另一個用戶,該用戶將接收到已打開的事務的連接,並可能導致狀態不一致。

在我的公司,我們在過去使用只讀非事務性查詢時遇到了很多問題,並調整了我們的框架來處理這個問題。 除此之外,我們與BoneCP開發人員進行了交談,他們接受開發一組功能來幫助處理此問題,例如自動回滾未提交的返回到池中的事務,並打印關於忘記提交事務的方法的堆棧跟蹤。

這個問題在這裏討論: http://jolbox.com/forum/viewtopic.php?f=3&t=98

相關問題