接続がプールに戻されたときに、BoneCP(または他のプール)は接続のステートメントを閉じますか?私が理解しているように、実際の接続のcloseメソッドを呼び出さないため、ステートメントを自動的に閉じることはありません。それで、それは他の方法でステートメントを閉じますか、それとも手動でステートメントを閉じる必要がありますか?
2 に答える
JDBC仕様は、通常の接続クローズで何が発生するかについて非常に不明確であるため、使用するプールに関係なく、常にステートメントを手動でクローズする必要があります。将来、期待どおりの動作をしない別のプールに切り替えることを選択した場合、アプリケーションに何が起こるかを検討してください。
BoneCPに関しては、答えはノーです。忘れた場合に接続を閉じるように構成できますが、ステートメントは閉じられません。これは、接続を閉じると、一部のJDBCドライバーがまだアクティブなステートメントを内部で閉じるため、パフォーマンス上の理由によるものです。
ただし、ステートメントのキャッシュが有効になっている場合、BoneCPはキャッシュされたステートメントをすべて閉じます。
編集:v0.8.0以降、閉じられていないステートメントを閉じるためのサポートが追加されました(+必要に応じて、ステートメントが開かれた場所のスタックトレースを出力します)。
BoneCP(0.8.0 -RC3)、2つの可能な結果があります。
キャッシュされていないステートメントのみの構成で終了します
statement.close()を明示的に呼び出しても、キャッシュされたステートメントに対してどのように構成しても、非クローズオフになります。
prepareStatementとcallableStatementをキャッシュするStatementCacheクラスがあります。デフォルトは無効になっています。有効にするには、> 0パラメーターを指定してBoneCPConfig.setStatementsCacheSize()を呼び出す必要があります。キャッシュを有効にした後、
1 BoneCP.Statement.Close()は、キャッシュされている場合、基になるステートメント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()」を使用してキャッシュをクリアするだけです。
幸いなことに、MYSQL JDBCドライバー、Connector / Jは、関数「closeAllOpenStatements()」を介して接続を閉じると、開いているすべてのステートメントを閉じます。