接続がプールに返されたとき、Bonecp(または他のプール)は接続の声明を閉じますか?
-
30-09-2019 - |
質問
接続がプールに返されたとき、Bonecp(または他のプール)は接続の声明を閉じますか?私が理解しているように、それは実際の接続の緊密な方法を呼び出さないので、自動ステートメントの閉鎖はありません。それで、それは他の方法で声明を閉じますか、それとも私はそれらを手動で閉じる必要がありますか?
解決
JDBCスペックは、通常の接続の近くで何が起こるべきかについて非常に不明です。そのため、使用するプールに関係なく、 いつも 声明を手動で閉じるようにしてください。あなたがあなたが期待することをあなたのためにしないことをしない将来的に別のプールに切り替えることを選択した場合、あなたのアプリケーションに何が起こるかを考えてください。
Bonecpに関しては、答えはノーです。忘れても接続を閉じるように構成できますが、あなたの声明を閉じません。一部のJDBCドライバーは、接続を閉じた場合、内部的にまだアクティブなステートメントを閉鎖するため、これはパフォーマンス上の理由です。
ただし、BENECPは、キャッシュを有効にしたステートメントがある場合、キャッシュされたステートメントを閉じます。
編集:V0.8.0の時点で、閉鎖されていないステートメントを閉じるためにサポートが追加されています(+必要に応じてステートメントが開かれた場所のスタックトレースを印刷します)。
他のヒント
Bonecp(0.8.0 -RC3)、2つの可能な結果があります。
キャッシュされていないステートメントのみの構成のみを締めくくります
キャッシュされたステートメント用にどのように構成しても非閉鎖 Statement.close()を明示的に呼び出します。
準備されたステートメントとcallablestatementをキャッシュするためのステートメントキャッシュクラスがあります。デフォルトは無効です。 bonecpconfig.setStatementsCachesize()を> 0パラメーターで呼び出して有効にする必要があります。キャッシュを有効にした後、
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()」を介してキャッシュをクリアするだけです
良いニュースは、MySQL JDBCドライバーであるConnector/Jが、「ClosealLopenStatements()」という関数を介して接続を閉じると、開かれたすべてのステートメントを閉じることです。