关闭Oracle连接?

时间:2011-07-01 19:39:18

标签: jdbc

我们总是听说我们应该在完成交易后关闭连接。我的问题是:即使我们不关闭连接,一旦我们离开我们正在创建连接的方法,垃圾收集器将回收内存。那么即使我们不关闭连接,实际问题又是什么呢?

1 个答案:

答案 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
}