一尘不染

用Java关闭数据库连接

java

我有些困惑,我从http://en.wikipedia.org/wiki/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还是两者兼而有之?

该站点间歇性地关闭,但是服务器一直在说这是数据库连接问题,我怀疑它没有关闭,但是我不知道该关闭哪个。


阅读 586

收藏
2020-03-02

共1个答案

一尘不染

使用完之后Connection,你需要通过调用其close()方法显式关闭它,以释放连接可能会保留的任何其他数据库资源(光标,句柄等)。

实际上,Java中的安全模式是在完成对ResultSet,,StatementConnection(按顺序)关闭后的代码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块可以稍作改进(以避免空检查):

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

但是,这仍然是非常冗长的,因此你通常最终使用helper类在null安全的helper方法中关闭对象,并且该finally块变为类似以下内容:

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

而且,实际上,Apache Commons DbUtils有一个DbUtils正是在执行该操作的类,因此无需编写你自己的类。

2020-03-02