9

メインスレッドで同じ休止状態のセッションを使用するスレッド #2 を生成するメインスレッドがあります。スレッド#2は、メインスレッドからの長時間実行プロセスのために、db接続を維持するために数分ごとに「select 1」を実行します。メインスレッドが処理で完了すると、コミットが呼び出されますが、エラーが発生します:

Caused by: org.hibernate.TransactionException: JDBC commit failed
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:161)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
    ... 5 more
Caused by: java.sql.SQLException: Can't call commit when autocommit=true
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:930)
    at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1602)
    at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:170)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:146)
    ... 6 more

メインスレッド内で、正常にコミットされる内部トランザクションを作成します。このエラーをスローするのは、コミット時の外部トランザクションだけです。自動コミットブール値を変更している可能性があるものはわかりません。接続を維持するために 2 番目のスレッドを導入する前は、このエラーは発生していませんでした。

4

2 に答える 2

6

Hibernate の使用方法を真剣に再考する必要があると思いますがrelaxAutoCommit、JDBC ドライバーの URL にパラメーターを追加することで、この問題を回避できます。

MySQL ドキュメントの詳細:

relaxAutoCommit

If the version of MySQL the driver connects to does not support transactions, still allow calls to commit(), rollback() and setAutoCommit() (true/false, defaults to 'false')?

Default: false

Since version: 2.0.13

ソース: https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html

于 2011-03-10T16:46:14.950 に答える