打开 jdbc 到数据库服务器的连接会降低应用程序的性能吗?
Will Open jdbc connections to a database server slow down the performance of an application?
我有一个自动化脚本来测试数据库,它创建到数据库服务器的连接并验证 table 值。同时,应用程序变得非常缓慢。打开的连接和应用程序的性能之间有什么关系吗?
当您使用完您的连接后,您需要通过调用其 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 */}
}
}
最好在使用后关闭 database/resource 个对象。最好在 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(....){}
不一定。事实上,打开连接不会降低应用程序的性能,除非特别合理。
性能可能受三个因素影响:
- CPU 用法。
- 内存占用。
- I/O 流量。
JDBC 连接,只是为了打开而不是为了使用,是否应该增加 CPU 使用率?原则上不,除非驱动程序在后台 运行 有自己的线程。
应该占很多内存吧?原则上不,因为 JDBC API 旨在通过 cursors 恢复数据(它不应该占用超过一个简单的工作缓冲区) - 除非驱动程序没有做正确的垃圾使用过的 udata 的集合。
它应该做很多 I/O 流量吗?原则上不会,除非驱动程序正在后台进行一些轮询或其他操作。
所以,如您所见,答案是它取决于 JCBC 驱动程序实现。不使用时立即关闭连接是在服务器端释放资源的好习惯,但通常在客户端并不重要。
如果您非常频繁地打开和关闭连接,我建议使用 JDBC 连接池,任何 JDBC 连接池都可以。
池会跟踪 use/reuse/multiplexing 连接,而不会经常打开和关闭它们。这样数据库负载就变轻了。
我有一个自动化脚本来测试数据库,它创建到数据库服务器的连接并验证 table 值。同时,应用程序变得非常缓慢。打开的连接和应用程序的性能之间有什么关系吗?
当您使用完您的连接后,您需要通过调用其 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 */}
}
}
最好在使用后关闭 database/resource 个对象。最好在 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(....){}
不一定。事实上,打开连接不会降低应用程序的性能,除非特别合理。
性能可能受三个因素影响:
- CPU 用法。
- 内存占用。
- I/O 流量。
JDBC 连接,只是为了打开而不是为了使用,是否应该增加 CPU 使用率?原则上不,除非驱动程序在后台 运行 有自己的线程。
应该占很多内存吧?原则上不,因为 JDBC API 旨在通过 cursors 恢复数据(它不应该占用超过一个简单的工作缓冲区) - 除非驱动程序没有做正确的垃圾使用过的 udata 的集合。
它应该做很多 I/O 流量吗?原则上不会,除非驱动程序正在后台进行一些轮询或其他操作。
所以,如您所见,答案是它取决于 JCBC 驱动程序实现。不使用时立即关闭连接是在服务器端释放资源的好习惯,但通常在客户端并不重要。
如果您非常频繁地打开和关闭连接,我建议使用 JDBC 连接池,任何 JDBC 连接池都可以。
池会跟踪 use/reuse/multiplexing 连接,而不会经常打开和关闭它们。这样数据库负载就变轻了。