【问题标题】:jdbc statement connectionjdbc语句连接
【发布时间】:2012-08-22 15:34:00
【问题描述】:

问题:您能否在非 MULTI THREAD 中使用同一连接同时操作多个语句和记录集?

我只发现了我感兴趣的这个问题,但答案并不一致。

JDBC Statement/PreparedStatement per connection

答案解释了我所知道的记录集和语句之间的关系。

鉴于此,您不能有多个记录集用于语句

答案说您可以有多个记录集进行连接。但没有提及任何其他来源。


我问是否可以循环第一个记录集,然后使用相同的连接(用于生成第一个记录集)打开另一个记录集,使用它在迭代中循环。定义此行为的文档在哪里?


我感兴趣的情况是这样的,语句中同时执行任务

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。

【问题讨论】:

  • 这里好像没有问题。你到底在问什么?
  • 是的,没有问号......无论如何。我在问是否可以循环第一个记录集,然后使用相同的连接(用于生成第一个记录集)打开另一个记录集,使用它并继续迭代。定义这种行为的文档在哪里?
  • 是的,这是可能的,只要您不尝试使用相同的语句来创建记录集(在问题的代码中,您不是)。

标签: sql jdbc connection


【解决方案1】:

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

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

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

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

【讨论】:

  • “并且每个新语句都必须等到前一个语句完成”所以我定义的代码无法工作,因为语句 stmt2 挂起等待 stmt ?.
  • @user1594895 您编写的代码块是按顺序执行的,因此您的 SQL 指令不会同时执行...我所做的观察仅适用于您使用多个线程执行任务时
  • @user1594895 还记得在完成后关闭 ResultSetStatement 对象(当然还有 Connection 对象)
【解决方案2】:

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

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

【讨论】:

  • 当生成它的 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet 对象将自动关闭。这就是为什么我们不能有多个记录集来声明,但我问的是“每个连接的声明”
  • 每个连接可以有多个语句。在非多线程应用程序中,一切都按顺序执行 => 你不能一次执行 2 条语句。
【解决方案3】:

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 会支持类似的机制

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2017-03-31
  • 2013-03-17
  • 2017-12-23
相关资源
最近更新 更多