我有一个自动化脚本来测试数据库,它创建与数据库服务器的连接并验证表值。同时应用程序非常慢。开放连接和应用程序性能之间是否有任何关系?
完成使用Connection后,需要通过调用close()
方法显式关闭它,以释放连接可能持有的任何其他数据库资源(游标,句柄等)。
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块中的连接,结果集和语句对象。
在Java7之前,需要使用finally块关闭所有这些资源。如果您使用的是Java 7,那么为了关闭资源,您可以使用try-with-resources,如下所示。
try(Connection con = getConnection(url, username, password, "org.postgresql.Driver");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
) {
//statements
}catch(....){}
不必要。事实上,除非特别合理,否则开放连接不会降低应用程序的性能。
性能可能受三个因素的影响:
JDBC连接只是用于打开而不是用于增加CPU使用率吗?原则上不行,除非驱动程序在后台运行一些自己的线程。
它应该占用大量内存吗?原则上不行,因为JDBC API旨在恢复数据(它不应占用多于一个简单的工作缓冲区) - 除非驱动程序没有对使用过的udata进行正确的垃圾收集。
它应该做很多I / O流量吗?原则上不,除非司机在后台进行一些轮询或其他事情。
因此,正如您所看到的,答案是它取决于JCBC驱动程序的实现。一旦不使用就关闭连接是在服务器端释放资源的一种很好的做法,但通常在客户端并不重要。
如果您经常打开和关闭连接,我建议使用JDBC连接池,任何JDBC连接池都可以。
池跟踪连接的使用/重用/多路复用,而不经常打开和关闭它们。这样,数据库负载变得更轻。