问题:您是否可以使用多个语句和记录集,它们在非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。
答案 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会支持类似的机制