2010-12-03 7 views
4

BoneCP(または他のプール)は、接続がプールに戻ったときに接続の文を閉じますか?私が理解しているように、実際の接続のcloseメソッドを呼び出さないので、自動的な文を閉じることはありません。それで、他の方法で文を閉じるか、手動で閉じる必要がありますか?BoneCP(または他のプール)は、接続がプールに戻ったときに接続の文を閉じますか?

答えて

5

通常の接続で何が起こるべきかについては、JDBC仕様は非常に不明です。使用するプールに関係なく、は常にである必要があります。将来別のプールに切り替えることを選択した場合、アプリケーションに何が起こるかを考えてください。これは、あなたが期待していることをしないものです。

BoneCPに関して、答えはいいえです。忘れてしまった場合に接続を切断するように設定することはできますが、文を閉じることはありません。これはパフォーマンス上の理由からです。一部のJDBCドライバは、接続を閉じると内部的にアクティブなステートメントを閉じます。

しかし、BoneCPは、キャッシュが有効になっている文がある場合は、キャッシュされたすべての文を閉じます。

EDIT:v0.8.0以降、閉鎖されていない文を閉じるためのサポートが追加されました(+必要に応じて文が開かれた場所のスタックトレースを出力します)。

1

BoneCP(0.8.0 -RC3)、

が非キャッシュされた文のみ

に関係なく、あなたが設定どのようにオフ非閉じていないため、いくつかの設定をオフに閉じる2つの可能な結果は、ありますstatement.close()を明示的に呼び出す場合でも、キャッシュされた文のために使用します。

preparedStatement & callableStatementをキャッシュするStatementCacheクラスがあります。デフォルトは無効です。有効にするには、> 0パラメータでBoneCPConfig.setStatementsCacheSize()を呼び出す必要があります。

1 BoneCP.Statement.Close()は、キャッシュされている場合、基本となるステートメントの終了をバイパスします。

public void close() throws SQLException { 
     this.connectionHandle.untrackStatement(this); 
    this.logicallyClosed.set(true); 
    if (this.logStatementsEnabled){ 
     this.logParams.clear(); 
     this.batchSQL = new StringBuilder(); 
     } 

     if (this.cache == null || !this.inCache){ // no cache = throw it away right now 
      this.internalStatement.close(); 
    } 
} 

2 BoneCP.Connection.close() 単に関数を使用してキャッシュをクリアします "clearStatementCaches()"

良いニュースは、コネクタ/ Jは、MySQL JDBCドライバで、すべて終了します関数 "closeAllOpenStatements()"を使用して接続を閉じるときに開かれたステートメント。

関連する問題