调试时没有关闭数据库连接的问题?

Nic*_*ner 6 java jdbc

我有一个Java应用程序,它在开始时打开与数据库的连接,并在最后关闭它.但是,程序并不总是完成,因为抛出异常或我正在调试它并在中途停止它.

这是否会导致打开连接以堆积和减慢数据库速度,还是会自动清理?

Pas*_*ent 8

数据库连接由数据库拥有和管理,该类只允许您访问该数据库资源.如果不关闭连接,那么Java类可能被垃圾收集,但数据库可能无法告知连接不再使用,这可能导致数据库资源被浪费(直到数据库端超时) )甚至泄漏.

因此,当您完成使用后Connection,您应该确保通过调用其close()方法显式关闭它.这将允许垃圾收集器尽可能早地重新收集内存,更重要的是,它释放连接可能保留的任何其他数据库资源(游标,句柄等).

在Java中执行此操作的传统方法是在完成它们时关闭您的ResultSet,, StatementConnection(按此顺序),finally并且安全模式如下所示:

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
    // Do stuff
    ...

} catch (SQLException ex) {
    // Exception handling stuff
    ...
} finally {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) { /* ignored */}
    }
    if (ps != null) {
        try {
            ps.close();
        } catch (SQLException e) { /* ignored */}
    }
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) { /* ignored */}
    }
}
Run Code Online (Sandbox Code Playgroud)

finally块可以略微改进(以避免空检查):

} finally {
    try { rs.close(); } catch (Exception e) { /* ignored */ }
    try { ps.close(); } catch (Exception e) { /* ignored */ }
    try { conn.close(); } catch (Exception e) { /* ignored */ }
}
Run Code Online (Sandbox Code Playgroud)

但是,这仍然是非常冗长,所以你通常最终使用一个帮助器类来关闭null安全帮助器方法中的对象,并且finally块变成这样的:

} finally {
    DbUtil.closeQuietly(rs);
    DbUtil.closeQuietly(ps);
    DbUtil.closeQuietly(conn);
}
Run Code Online (Sandbox Code Playgroud)

实际上,Apache Commons DbUtils有一个DbUtils正是这样做的类,因此不需要编写自己的类.

在您的情况下,这将解决异常的问题,但不会解决调试问题(并且您将浪费数据库资源,直到数据库端发生超时).所以1.不要使用生产数据库调试代码2.尝试执行调试会话直到结束.