1

PreparedStatementオブジェクトからを取得しConnection、後で参照を別の で上書きするとしますPreparedStatement。それから、後で、私close()は参照します。最初PreparedStatementのもの (参照を失ったもの) は開いたままになりますか? それとも、プロトコルまたはガベージ コレクションによって処理されますか?

例えば:

PreparedStatement ps = connection.prepareStatement(MY_QUERY);
// do stuff
ps.execute();

ps = connection.prepareStatement(MY_OTHER_QUERY);
// do stuff
ps.execute();

ps.close();

の実行に使用された最初のPreparedStatementオブジェクトMY_QUERYは開いたままですか?

4

3 に答える 3

7

はい、PreparedStatementガベージコレクションが行われるまで開いたままになります*(あるとしても)。

そのため、取得した外部リソースを常に解放(クローズ)するルールが常に表示されます。

JDBCリソース(このプリペアドステートメント、接続、結果セットなど)とIOリソース(ソケット、ストリームなど)は、Javaで手動で管理する必要がある最も一般的な2つのリソースです。

*厳密に言えば、GCを取得する少し前に、GCの対象になったの方法で閉じることができますが、この説明ではこれで十分です。finalize

于 2012-12-20T15:32:11.143 に答える
1

オブジェクトが最終的にガベージ コレクションされると閉じられます。ガベージ コレクション プロセスはほとんど制御できないため、ステートメントを使い終わったらすぐにステートメントを閉じることをお勧めします。

のドキュメントからStatement.close()

この Statement オブジェクトのデータベースと JDBC リソースを、自動的に閉じられるまで待つのではなく、ただちに解放します。データベース リソースを拘束しないように、リソースの使用が終了したらすぐにリソースを解放することをお勧めします。

于 2012-12-20T15:33:44.840 に答える
1

開いたままになり、ガベージが収集されたときに閉じられるという保証はありません。それは実装に依存します。実装は、たとえば FileInputStream.finalize のように finalize をオーバーライドする必要があります。

「...このファイル入力ストリームへの参照がなくなったときに、このファイル入力ストリームの close メソッドが呼び出されるようにします。」

ただし、Connection.close は PreparedStatement を閉じることができます。Connection.close の API を参照してください。

「..この接続オブジェクトのデータベースと JDBC リソースが自動的に解放されるのを待つのではなく、すぐに解放します..」

ただし、接続がプールされていない場合に限ります。

于 2012-12-20T15:49:12.407 に答える