结果集打开时执行语句(JDBC / JAVA)

时间:2013-12-17 01:16:02

标签: java jdbc

在结果打开时执行独立语句是安全还是建议?如果它们连接到不同的连接或与结果集相同的连接是否重要?我特别关注结果如何锁定(如果有的话),这可能会导致死锁。

实施例

while(resultSet.next()) {
     Execute separate statements in here ( same or different connection )
}

也是由底层游标或其他东西支持的结果集?

3 个答案:

答案 0 :(得分:3)

这里有几个问题。

首先,通常“是”在迭代ResultSet时运行其他SQL语句是可能的,也是常见的。是的,ResultSets由游标支持。

也可以创建一个死锁,所以你只需要知道这一点。如果在循环内部执行的SQL未修改与ResultSet相同的表中的行,则应确保使用并发模式ResultSet创建CONCUR_READ_ONLY,并且通常尝试使用TYPE_FORWARD_ONLY

例如:

Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,
                                     ResultSet.CONCUR_READ_ONLY);

如果在常规锁中使用CONCUR_READ_ONLYTYPE_FORWARD_ONLY,则不应生成块写入。建议使用相同的Connection对象,因为光标和修改其他对象的SQL都在同一个事务中,因此不太可能导致死锁。

答案 1 :(得分:0)

根据我的观点,它是安全的..

  

ResultSet通常链接到通常链接到Connection的Statement。   Statement对象在Statement对象时自动关闭   生成它的是关闭,重新执行或用于检索下一个   由多个结果序列产生。

     

完成后关闭ResultSet

     

完成后立即关闭ResultSet个对象   甚至与ResultSet对象一起工作   虽然Statement对象关闭了   ResultSet隐含的对象   关闭,明确关闭ResultSet   给垃圾收集器机会   尽早回忆记忆   因为ResultSet对象可能占用   大量内存取决于查询。

     

ResultSet.close();

答案 2 :(得分:0)

非常安全。您有两个基本选择:

  • 使用其他Connection对象。
  • 使用相同的Connection对象。

主要区别在于如何处理交易。

  • 不同的连接总是在不同的交易中
  • 如果将自动提交模式设置为false,则可以使同一连接中的不同语句位于同一事务中。

SQL服务器保证两个不在同一事务中的语句不会相互干扰(通常这意味着如果较旧的事务可能仍需要它,服务器将保留任何已修改数据的副本)。它也取决于服务器如何执行锁定(如果有的话),但它必须保证不会发生死锁。通常它通过一个名为serialization的进程来完成,它涉及将事务存储在日志中,直到它们可以保证在没有死锁的情况下执行。

相关问题