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 中执行更新,您可能会收到如下错误:

java.sql.SQLException:当前连接上有一个打开的结果集,必须在执行查询之前关闭。

所以你不能在同一个连接中混合 SQL。

4

3 回答 3

0

如果我理解正确,您需要在一个方法中同时处理两个(或更多)结果集。

这是可能的,而且效果很好。但是你必须记住一些事情:

  • 您在每个记录集上所做的一切都由单个 处理Connection,除非您为每个Statement(和ResultSet)声明新连接
  • 如果你需要做一个多线程的进程,我建议你Connection为每个线程创建一个(或者使用一个连接池);如果您在多线程进程中使用单个连接,您的程序将挂起或崩溃,因为每个 SQL 语句都通过单个连接,并且每个新语句都必须等到前一个语句完成。

除此之外,您的问题需要澄清一下。你真正需要做什么?

于 2012-08-22T15:45:52.587 回答
0

当生成它的 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet 对象将自动关闭。

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 回答