打开JDBC ResultSet的数量是否有限制?

时间:2015-07-23 15:30:56

标签: java mysql jdbc

我目前正在使用JDBC和MySQL,我想知道在给定时间内可以打开的ResultSet对象的数量是否有限制。我无法在SO或文档中的任何其他地方找到答案。

我问,因为我的程序可能会生成并操纵相当多的这些ResultSet,我担心这会产生任何后果。我的替代方法是创建一组模仿我需要的ResultSet方法的类,但是这需要我的数据库中的每个表都有这样一个类(我有很多这样的表)。

2 个答案:

答案 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 或者你会泄漏数据库资源。

来自ResultSet documentation

  

当生成它的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