在结果打开时执行独立语句是安全还是建议?如果它们连接到不同的连接或与结果集相同的连接是否重要?我特别关注结果如何锁定(如果有的话),这可能会导致死锁。
实施例
while(resultSet.next()) {
Execute separate statements in here ( same or different connection )
}
也是由底层游标或其他东西支持的结果集?
泰
答案 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_ONLY
和TYPE_FORWARD_ONLY
,则不应生成块写入。建议使用相同的Connection
对象,因为光标和修改其他对象的SQL都在同一个事务中,因此不太可能导致死锁。
答案 1 :(得分:0)
根据我的观点,它是安全的..
ResultSet通常链接到通常链接到Connection的Statement。 Statement对象在Statement对象时自动关闭 生成它的是关闭,重新执行或用于检索下一个 由多个结果序列产生。
完成后关闭ResultSet
完成后立即关闭
ResultSet
个对象 甚至与ResultSet
对象一起工作 虽然Statement
对象关闭了ResultSet
隐含的对象 关闭,明确关闭ResultSet
给垃圾收集器机会 尽早回忆记忆 因为ResultSet
对象可能占用 大量内存取决于查询。
ResultSet.close();
答案 2 :(得分:0)
非常安全。您有两个基本选择:
主要区别在于如何处理交易。
SQL服务器保证两个不在同一事务中的语句不会相互干扰(通常这意味着如果较旧的事务可能仍需要它,服务器将保留任何已修改数据的副本)。它也取决于服务器如何执行锁定(如果有的话),但它必须保证不会发生死锁。通常它通过一个名为serialization的进程来完成,它涉及将事务存储在日志中,直到它们可以保证在没有死锁的情况下执行。