jdbc语句连接

时间:2012-08-22 15:34:00

标签: sql jdbc connection

问题:您是否可以使用多个语句和记录集,它们在非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。

3 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:-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会支持类似的机制

相关问题