我有一个Java应用程序,它在开始时打开到数据库的连接,并在结束时关闭它。然而,程序并不总是结束,因为抛出了一个异常,或者我正在调试它并在中途停止了它。
这会导致打开的连接堆积并减慢数据库速度,还是会自动清除?
发布于 2010-01-23 11:34:43
数据库连接由数据库拥有和管理,类只提供对该数据库资源的访问。如果不关闭连接,那么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 */}
}
}可以将finally块稍微改进为(以避免null检查):
} finally {
try { rs.close(); } catch (Exception e) { /* ignored */ }
try { ps.close(); } catch (Exception e) { /* ignored */ }
try { conn.close(); } catch (Exception e) { /* ignored */ }
}但是,这仍然是非常冗长的,所以你通常会使用一个帮助器类来关闭空安全的帮助器方法中的对象,finally块变成了这样:
} finally {
DbUtil.closeQuietly(rs);
DbUtil.closeQuietly(ps);
DbUtil.closeQuietly(conn);
}实际上,Apache Commons DbUtils有一个DbUtils类,它就是这样做的,所以不需要编写自己的类。
在您的情况下,这将解决异常问题,但不会解决调试问题(并且您将浪费数据库资源,直到数据库端发生超时)。所以1.不要使用生产数据库调试你的代码2.试着执行你的调试会话直到最后。
https://stackoverflow.com/questions/2121805
复制相似问题