我目前正在使用JDBC和MySQL,我想知道在给定时间内可以打开的ResultSet对象的数量是否有限制。我无法在SO或文档中的任何其他地方找到答案。
我问,因为我的程序可能会生成并操纵相当多的这些ResultSet,我担心这会产生任何后果。我的替代方法是创建一组模仿我需要的ResultSet方法的类,但是这需要我的数据库中的每个表都有这样一个类(我有很多这样的表)。
答案 0 :(得分:2)
每个开放的JDBC ResultSet
,除了在JVM中需要的资源外,还在MySQL和其他DBMS中维护数据库端的开放游标。
每个打开的游标显然需要服务器端资源,例如内存,可能是磁盘空间,锁等。在MySQL中,每个游标都实现为内存临时表,可能实现为磁盘表,为described in the documentation。
换句话说,维护过多的open ResultSet
可能会耗尽数据库服务器资源并导致并发问题,例如锁争用或死锁。最好将它们(以及其他人提到的连接数)保持在最低限度。
答案 1 :(得分:2)
每个ResultSet
属于Statement
,每个Statement
都与数据库游标相关联,数据库游标通常是数据库中的有限资源。 MySQL doesn't have an upper limit, but having too many open cursors will affect database performance
您不必关闭ResultSet
(例如,如果您重新执行该语句,它将被关闭并重新开启)但您必须关闭Statement
s 或者你会泄漏数据库资源。
当生成它的Statement对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象会自动关闭。
一旦超过(可配置的)每会话限制,Oracle等某些数据库将返回ORA-01000: Too many open cursors
等错误。
一般情况下,您应该尽快关闭Statement
。使用Java 7的try-with-resources非常方便:
try (final Statement s = conn.createStatement()) {
final ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
// process each row of the result
}
} // statement is auto-closed
如果您多次重复同一查询,只有查询参数不同,请使用PreparedStatement
。