在不啟動事務的情況下通過 Hibernate 對 MySQL 數據庫運行查詢意味著什麼? (What are the implications of running a query against a MySQL database via Hibernate without starting a transaction?)


問題描述

在不啟動事務的情況下通過 Hibernate 對 MySQL 數據庫運行查詢意味著什麼? (What are the implications of running a query against a MySQL database via Hibernate without starting a transaction?)

It seems to me that we have some code that is not starting a transaction yet for read-only operations our queries via JPA/Hibernate as well as straight SQL seem to work.  A hibernate/jpa session would have been opened by our framework but for a few spots in legacy code we found no transactions were being opened.

What seems to end up happening is that the code usually runs as long as it does not use EntityManager.persist and EntityManager.merge.  However once in awhile (maybe 1/10) times the servlet container fails with this error...

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.) 

As far as I can tell only the few spots in our application code that do not have transactions started before a query is made will have this problem.  Does anybody else think it could be the non-transactional query running that causes this behaviour?

FYI here is our stack...

-Guice -Guice-Persist -Guice-Servlet -MySql 5.1.63 -Hibernate/C3P0 4.1.4.Final -Jetty


參考解法

方法 1:

Yes, I think.

If you start a query without opening a transaction, this transaction will be opened automatically by the underlying layer. This connection, with an opened transaction, will be returned to the connection pool and given to another user, that will receive a connection to an already-opened transaction, and that could lead to inconsistent state.

Here in my company we had a lot of problems in the past with read-only non-transactional queries, and adjusted our framework to handle this. Besides that, we talked to BoneCP developers and they accepted to develop a set of features to help handle this problem, like auto-rollback uncommitted transactions returned to the pool, and print a stack trace of what method forgot to commit the transaction.

This matter was discussed here: http://jolbox.com/forum/viewtopic.php?f=3&t=98

(by benstpierreBrunoJCM)

參考文件

  1. What are the implications of running a query against a MySQL database via Hibernate without starting a transaction? (CC BY-SA 3.0/4.0)

#jdbc #java #MySQL #hibernate #guice-persist






相關問題

在不啟動事務的情況下通過 Hibernate 對 MySQL 數據庫運行查詢意味著什麼? (What are the implications of running a query against a MySQL database via Hibernate without starting a transaction?)

Праблема з заявай аб абнаўленні Java (Java Update statement issue)

我的 Jar 應用程序(myapplication.jar + Mysql 連接器)在其他計算機上不起作用 (My Jar application(myapplication.jar + Mysql connector) doesnt work on other computer)

executeBatch JDBC 的堆大小錯誤 (Heapsize error with executeBatch JDBC)

格式為“07-apr-2016”的 Java 日期字符串在轉換為 sqldate 時會產生錯誤的結果 (A Java date string in the format "07-apr-2016" produces wrong result when converted to sqldate)

SQLite 中的臨時內存數據庫 (Temporary in-memory database in SQLite)

Websphere 6.1 中的 SQL 日誌記錄 (SQL logging in Websphere 6.1)

我在哪裡可以下載 MySQL Connector/J 的源代碼 (Where can I download source for MySQL Connector/J)

'用戶必須在 weblogic 重新啟動時提供 JDBC 連接' ('The user must supply a JDBC connection' on weblogic restart)

配置 Jetty 6 以使用 commons.dbcp 數據源 (Configuring Jetty 6 to use commons.dbcp datasource)

在netbeans上訪問mysql (Access mysql on netbeans)

spark中的jdbc更新語句 (Jdbc update statement in spark)







留言討論