问题

我有点困惑,我正在阅读以下来自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.close(),会发生什么?

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

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


#1 热门回答(159 赞)

完成使用yourConnection后,需要通过调用其close()方法显式关闭它,以释放连接可能持有的任何其他数据库资源(游标,句柄等)。

实际上,Java中的安全模式是当你完成它们时,在afinallyblock中关闭你的ResultSet,StatementConnection(按此顺序),类似的东西:

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 */ }
}

但是,这仍然是非常冗长,所以你通常最终使用一个帮助器类来关闭null安全帮助器方法中的对象,并且finally块变成这样的:

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

而且,实际上,480011888具有6464663899类,这正是这样做的,所以不需要自己编写。


#2 热门回答(45 赞)

使用后关闭数据库/资源​​对象总是更好。最好关闭finallyblock中的连接,结果集和语句对象。

在Java7之前,需要使用afinallyblock关闭所有这些资源。如果你使用的是Java 7,则可以按如下方式关闭资源。

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

//statements
}catch(....){}

现在,con,stmt和rs对象成为try块的一部分,java在使用后自动关闭这些资源。

希望我有所帮助。


#3 热门回答(11 赞)

这足以关闭justStatementConnection。没有必要明确关闭ResultSet对象。

Java文档说约java.sql.ResultSet

当Statement对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,Statement对象会自动关闭该对象。

感谢BalusC的评论:"我不会依赖它。一些JDBC驱动程序失败了。"


原文链接