0

質問:非マルチスレッドで同じ接続を使用して、同時に動作する複数のステートメントとレコードセットを使用できますか?

私は興味のあるこの質問を見つけただけですが、答えは一貫していません。

接続ごとのJDBCステートメント/PreparedStatement

答えは、私が知っているレコードセットとステートメントの関係を説明しています。

そのため、ステートメントに複数のレコードセットを含めることはできません

答えは、接続用に複数のレコードセットを持つことができるということです。しかし、他の情報源については言及されていません。


最初のレコードセットをループしてから、同じ接続(最初のレコードセットの生成に使用)を使用して別のレコードセットを開くことが可能かどうかを尋ねています。これを繰り返しループで使用します。そして、この動作を定義するドキュメントはどこにありますか?


私が興味を持っている状況はこのようなもので、ステートメントは同時にタスクを実行します

Connection con = Factory.getDBConn (user, pss, endpoint, etc);
Statement stmt = con.createStatement ();
ResultSet rs = stmt.executeQuery ("SELECT TEXT FROM dba");

while (rs.next ()) {
 rs.getInt (....
 rs.getInt (....
 rs.getInt (....
 rs.getInt (....

 Statement stmt2 con.createStatement = ();
 ResultSet rs2 = stmt2.executeQuery ("iSelect ......");
 while (rs2.next ()) {
 ....
 rs2.close ();
 stm2.close ();

 Statement stmt3 con.createStatement = ();
 ResultSet rs3 = stmt3.executeQuery ("Insert Into table xxx ......");
 ....
 rs3.close ();
 stm3.close ();
}

もう少し明確にするために:stmt3でupdateを実行すると、次のようなエラーが発生する可能性があります。

java.sql.SQLException:現在の接続に開いている結果セットがあります。これはクエリを実行する前に閉じる必要があります。

したがって、同じ接続でSQLを混在させることはできません。

4

3 に答える 3

0

私が正しく理解している場合は、1つのメソッド内で2つ(またはそれ以上)の結果セットを同時に操作する必要があります。

それは可能であり、うまく機能します。ただし、いくつか覚えておく必要があります。

  • それぞれ(および)Connectionに対して新しい接続を宣言しない限り、各レコードセットで行うすべてのことは単一のによって処理されます。StatementResultSet
  • マルチスレッドプロセスを実行する必要がある場合は、スレッドConnectionごとにを作成する(または接続プールを使用する)ことをお勧めします。マルチスレッドプロセスで単一の接続を使用すると、すべてのSQLステートメントが単一の接続を通過するため、プログラムがハングまたはクラッシュし、すべての新しいステートメントは前のステートメントが終了するまで待機する必要があります。

それに加えて、あなたの質問にはいくつかの説明が必要です。あなたは本当に何をする必要がありますか?

于 2012-08-22T15:45:52.587 に答える
0

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

http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html

于 2012-08-23T11:10:29.337 に答える
-1

SQL Serverは、複数のレコードセットをサポートするデータベースです。したがって、たとえば、単一のストアドプロシージャでいくつかのクエリを実行できます。

SELECT * FROM employees
SELECT * FROM products
SELECT * FROM depts

その後、各レコードセット間を移動できます。少なくとも私はあなたが例えば.Netでこれを行うことができることを知っています

using (var conn = new SqlConnection("connstring"))
using (var command = new SqlCommand("SPName", conn))
{
    conn.Open();
    command.CommandType = CommandType.StoredProcedure;
    var (reader = command.ExecuteReader())
    {
       while(reader.Read())
       {
           //Process all records from first result set
       }
       reader.Next();
       while(reader.Read())
       {
           //Process all records from 2nd result set
       }
       reader.Next();
       while(reader.Read())
       {
              //Process all records from 3rd result set
        }
     }
}

私はJavaが同様のメカニズムをサポートすると思います

于 2012-08-22T15:42:43.397 に答える