我们总是听说我们应该在完成交易后关闭连接。我的问题是:即使我们不关闭连接,一旦我们离开我们正在创建连接的方法,垃圾收集器将回收内存。那么即使我们不关闭连接,实际问题又是什么呢?
答案 0 :(得分:2)
不,GC在这里没有帮助,因为它不是关于记忆的。
连接是数据库服务器上的稀缺资源,而不是应用客户端中的资源。如果清理 内存而不告诉服务器执行相同操作,则会泄漏可能无法回收的连接。最终你会用完。
与ResultSet相同 - 它是一个游标。
您必须始终关闭所有SQL资源 - Connection,Statement和ResultSet - 在单个finally块中,以try / catch块的形式包装,与获取的顺序相反。
public class JdbcTemplate {
public Object exampleSqlOperation(Connection c) throws SQLException {
Object results = null;
Statement st = null;
ResultSet rs = null;
try {
// SQL stuff here
// Load into results Object - data structure
} catch (SQLException e) {
e.printStackTrace(); // Better to log it.
} finally {
DatabaseUtils.close(rs);
DatabaseUtils.close(st);
}
return results;
}
}
public class DatabaseUtils {
public static void close(Connection c) {
try {
if (c != null) c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// Same for Statement, ResultSet
}