4

複数のクエリを連続して実行する必要がある

Statement st = cnx.createStatement();
ResultSet rs = st.executeQuery( "SELECT [good stuff]");
// do something smart with rs
rs = st.execute( "SELECT [better stuff]");
// do something smarter with rs
rs = st.execute( "SELECT [best stuff]");
// you got it
try{ rs.close();} catch( SQLException ignore){};
try{ st.close();} catch( SQLException ignore){};

これは、最初の 2 つの ResultSet が適切に閉じられていないという問題ですか、それともガベージ コレクション中に暗黙的に行われているのでしょうか?

4

2 に答える 2

18

2 番目のクエリを実行するとすぐに、前のクエリResultSetは自動的に閉じられます。Garbage Collection心配する必要はありません。stmt.close()最後にa を付けることができます。それだけです。関連するすべてのオブジェクトを自動的に閉じResultSetます。

見てみましょう: -ResultSet#closeドキュメンテーションには次のように書かれています: -

ResultSet オブジェクトは、Statement オブジェクトが閉じられるか、再実行されるか、複数の結果のシーケンスから次の結果を取得するために使用されると、それを生成した Statement オブジェクトによって自動的に閉じられます。

結果セットが閉じられるかどうかをテストしたい場合は、while ループを使用して while ループを反復処理し、result set別のクエリを作成して同じ結果セットに割り当てることができます。例外がスローされることがわかります..

ResultSet res = stmt.executeQuery("SELECT * FROM sometable");

while (res.next()) {
    res.getString(1);

    // Closes the previous `ResultSet`
    res = stmt.executeQuery("SELECT * FROM othertable");
} 

したがって、上記のコードでは、2 回目の繰り返しで、Exception: - Cannot perform operation after ResultSet is closed

于 2012-10-15T20:04:08.360 に答える
0

何が問題なのかわかりませんが、このコードの実行に問題がある場合は、接続を閉じて他のものを開いて、2 番目のクエリを作成することができます。SQLite などの一部のデータベース製品は、開いている接続を 1 つだけ許可します。データベースへのアクセスに問題がある場合は、それを試してみてください。

于 2012-10-15T20:24:06.887 に答える