0

Tomcat と、mysql データベースで JDBC 接続プールを使用しています。java.sql.Connection が作成され、#setAutoCommit(false) が設定され、コミットなしで select ステートメントが実行され、続いて接続が閉じられると、キャッシュされた接続がプールに返されるように見えます。同一の選択が実行された後で作成された後続の接続は、データベースから古いデータを返します。選択のみが実行されるセッションを強制的にコミットするという点で、この動作は奇妙に思えます。そうしないと、別のノードによって反映された変更を確認できません。この動作を回避する方法はありますか、またはすべての選択をコミットする必要がありますか?

4

1 に答える 1

0

問題は、接続 API のコントラクトをどのように定義するかにかかっています。commit[1] および rollback[2] メソッドは、データベースのロックが解除されるときです。選択後にコミットまたはロールバックしなかったため、接続がプールに戻されるときにこれらのロックが維持されます。したがって、接続で維持されているロックを解放できるように、選択を行った後にコミットまたはロールバックする必要があります。

[1] http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#commit() [2] http://docs.oracle.com/javase/7/docs /api/java/sql/Connection.html#rollback()

于 2013-10-30T14:51:50.607 に答える