4

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

4

2 に答える 2

5

JDBC仕様は、通常の接続クローズで何が発生するかについて非常に不明確であるため、使用するプールに関係なく、常にステートメントを手動でクローズする必要があります。将来、期待どおりの動作をしない別のプールに切り替えることを選択した場合、アプリケーションに何が起こるかを検討してください。

BoneCPに関しては、答えはノーです。忘れた場合に接続を閉じるように構成できますが、ステートメントは閉じられません。これは、接続を閉じると、一部のJDBCドライバーがまだアクティブなステートメントを内部で閉じるため、パフォーマンス上の理由によるものです。

ただし、ステートメントのキャッシュが有効になっている場合、BoneCPはキャッシュされたステートメントをすべて閉じます。

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

于 2010-12-04T14:20:08.320 に答える
1

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()」を介して接続を閉じると、開いているすべてのステートメントを閉じます。

于 2013-09-22T16:28:10.210 に答える