我有一个自动化脚本来测试数据库,该脚本创建与db服务器的连接并验证表值。同时,应用程序运行非常缓慢。开放连接与应用程序性能之间有什么关系吗?
答案 0 :(得分:2)
使用完连接后,您需要通过调用其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(....){}
答案 1 :(得分:1)
不一定。实际上,除非有合理依据,否则不希望打开的连接会降低应用程序的性能。
性能可能受到三个因素的影响:
仅用于打开而不用于使用的JDBC连接是否会增加CPU使用率?原则上不可以,除非驱动程序在后台运行自己的某个线程。
它会占用很多内存吗?原则上不可以,因为JDBC API设计用于通过 cursors 来恢复数据(它不应只占用简单的工作缓冲区),除非驱动程序没有对使用过的udata进行正确的垃圾收集。>
它会占用大量I / O流量吗?原则上不可以,除非驾驶员在后台进行轮询或其他操作。
因此,如您所见,答案是这取决于JCBC驱动程序的实现。在服务器端释放资源时,不使用连接就立即关闭是一种很好的做法,但通常在客户端并不重要。
答案 2 :(得分:0)
如果您经常打开和关闭连接,我建议使用JDBC连接池,任何JDBC连接池都可以。
该池跟踪连接的使用/重用/复用,而无需经常打开和关闭它们。这样,数据库负载就减轻了。