我有一个Java应用程序,它在开始时打开与数据库的连接,并在最后关闭它.但是,程序并不总是完成,因为抛出异常或我正在调试它并在中途停止它.
这是否会导致打开连接以堆积和减慢数据库速度,还是会自动清理?
数据库连接由数据库拥有和管理,该类只允许您访问该数据库资源.如果不关闭连接,那么Java类可能被垃圾收集,但数据库可能无法告知连接不再使用,这可能导致数据库资源被浪费(直到数据库端超时) )甚至泄漏.
因此,当您完成使用后Connection,您应该确保通过调用其close()方法显式关闭它.这将允许垃圾收集器尽可能早地重新收集内存,更重要的是,它释放连接可能保留的任何其他数据库资源(游标,句柄等).
在Java中执行此操作的传统方法是在完成它们时关闭您的ResultSet,, Statement和Connection(按此顺序),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.尝试执行调试会话直到结束.
| 归档时间: |
|
| 查看次数: |
7572 次 |
| 最近记录: |