2016-12-30 3 views
1

私はDB2を使用しています。私はそれのためのConnectionPoolを作成しました。 「aumoCommit = false」モードで実行する必要のあるクエリの一部。autoCommit varはクローズ時にc3p0でリセットされますか?

Connection con = ConnectionPool.getConnection // wrapper 
con.setAutoCommit(false); 
PreparedStatment ps = con.prepareStatement(// query...); 
ps.setString(...); 
ps.executeUpdate(); 
con.commit(); 
ps.close(); 
con.close(); 
con.setAutoCommit(true); // should be here ? 

質問です:私は最後にcon.setAutoCommit(真)の行を追加したり、C3P0は、すべて閉じられた(プールに戻さ)接続の状態をリセットする必要がありますか?

編集:いくつかのコメントの後、私は私の質問が追加する必要があります:con.setAutoCommit(false)コールが一般的に存在するか、この接続のc3P0リセット状態と、この接続がcon.setAutoCommit(false )デフォルトでは?

+1

接続を閉じた後(プールに返す)、 'setAutoCommit'を呼び出すと、その論理ハンドルが実際に閉じられているかのように振る舞うようになります。 –

+0

@ MarkRotteveel私の質問は、setAutoCommit(false)を呼び出す場所に関するものではありません、それは一般的にそれを呼び出す必要がありますか? – megabobik

+0

よく動作する接続プールでは、JDBC仕様に記載されているように新しい接続であるかのように接続を初期状態にリセットする必要がありますが、すべての接続プールでそのように動作するわけではありません。 C3P0についてはわからない –

答えて

3

c3p0は、autoCommitの接続を常にJDBC仕様ごとにtrueに設定しています。

一般的に、c3p0は、通常のクライアントセッション中に何もしないと、将来のクライアントセッションに影響しないように努めます。 Connectionがプールにチェックインされると、c3p0は完全にリセットされ、その状態を復元します。

クライアントセッション間で「スティック」する接続状態を定義できる唯一の場所は、ConnectionCustomizerのonAcquire(...)メソッドであり、クライアントセッションが開始される前に呼び出されます。しかし、これは、JDBC仕様によって値が未定義のConnection属性に対してのみ機能します。 autoCommitはspecによって新しいConnectionのtrueである必要があり、JDBC透過接続プーリングではプールされた新しい接続がアプリケーションのセマンティクスで区別できないようにするために、新しくチェックアウトされたConnectionは常にautoCommitをtrueに設定します。

関連する問題