在 Java 中关闭数据库连接

新手上路,请多包涵

我有点困惑。我正在从 _Java Database Connectivity_ 阅读以下内容:

 Connection conn = DriverManager.getConnection(
     "jdbc:somejdbcvendor:other data needed by some jdbc vendor",
     "myLogin",
     "myPassword" );

Statement stmt = conn.createStatement();
try {
    stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
} finally {
    // It's important to close the statement when you are done with it
    stmt.close();
}

您不需要关闭 conn 连接吗?如果 conn.close() 没有发生,到底发生了什么?

我有一个我正在维护的私有 Web 应用程序,它目前没有关闭任何一种形式,但重要的是真正的 stmt 一个, conn 一个,还是两者?

该站点不断间歇性地关闭,但服务器一直说这是数据库连接问题。我怀疑它没有被关闭,但我不知道要关闭哪个(如果有的话)。

原文由 onaclov2000 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 768
2 个回答

当您使用 Connection 后,您需要通过调用其 close() 方法显式关闭它,以便释放任何其他数据库资源(游标、句柄等)连接可能会坚持下去。

Actually, the safe pattern in Java is to close your ResultSet , Statement , and Connection (in that order) in a finally block当你完成它们时。是这样的:

 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 块可以稍微改进为(以避免空检查):

 } finally {
    try { rs.close(); } catch (Exception e) { /* Ignored */ }
    try { ps.close(); } catch (Exception e) { /* Ignored */ }
    try { conn.close(); } catch (Exception e) { /* Ignored */ }
}

但是,这仍然非常冗长,因此您通常最终会使用辅助类来关闭空安全辅助方法中的对象,并且 finally 块变成如下所示:

 } finally {
    DbUtils.closeQuietly(rs);
    DbUtils.closeQuietly(ps);
    DbUtils.closeQuietly(conn);
}

而且,实际上, Apache Commons DbUtils 有一个 DbUtils 类,它正是这样做的,所以没有必要编写你自己的。

原文由 Pascal Thivent 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用后最好关闭数据库/资源对象。最好关闭 finally 块中的连接、结果集和语句对象。

在 Java 7 之前,所有这些资源都需要使用 finally 块来关闭。如果您使用的是 Java 7,那么对于关闭资源,您可以执行以下操作。

 try(Connection con = getConnection(url, username, password, "org.postgresql.Driver");
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
) {

    // Statements
}
catch(....){}

现在, constmtrs 对象成为 try 块的一部分,Java 在使用后自动关闭这些资源。

原文由 Yadu Krishnan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题