我应该在SQL中关闭连接多少次?

时间:2009-12-16 18:22:16

标签: java sql jdbc

我的数据库类中有很多方法,它们都有一个语句,何时应该关闭连接?在每个方法中还是在数据库类的末尾?

11 个答案:

答案 0 :(得分:6)

完成交易后应关闭连接。由于我们不知道类的内容或其用法,因此无法判断您对连接的访问​​何时开始或结束。

实际上,如果连接专用于特定用途而不是池中,则可能甚至不成立。您可能希望在申请期间保持开放状态。

答案 1 :(得分:3)

我们发现最好的策略是从连接池获取连接,执行单个事务,然后立即将连接放回池中。这样就不会为长逻辑块保留连接,从而阻止其他线程使用它 - 这是可伸缩性的一个问题。

答案 2 :(得分:1)

作为最佳实践,您应该在完成后关闭逻辑位置的连接 - 在完成该任务的所有数据库活动之后。

答案 3 :(得分:1)

通常,您应该以打开它的相同方法关闭连接。关闭和打开连接并不是一项艰巨的任务,因为现代数据库服务器甚至在“热备用”上保持关闭连接,因此可以通过连接池快速访问它们。让它们保持打开状态......这可能会让你陷入困境,并且可能成为调试的噩梦。

答案 4 :(得分:1)

使用lombok,它将为你处理try / catch和conn.close()


public void doSomething() throws SQLException {

@Cleanup Connection connection = database.getConnection();
}

lombok

答案 5 :(得分:0)

这取决于您何时以及如何重复使用这些方法。如果它们是顺序的,你应该只在最后关闭连接,而不是经常打开和关闭

答案 6 :(得分:0)

这在很大程度上取决于您的数据库类的功能。如果在不同时间单独调用方法,则方法应负责打开和关闭连接。但是,如果类执行某种调用许多方法的大型处理操作,那么您可能希望打开和关闭各个方法之外的连接。

最重要的是,无论您在何处打开连接,都可以关闭连接。否则,你会开始做出关于连接状态的假设,这可能会让你陷入困境。

答案 7 :(得分:0)

finally块的try块中,关闭相同方法块中的连接(以及语句和结果集!)。打开了。

一般习语是:

public void doSomething() throws SQLException {
    Connection connection = null;
    try {
        connection = database.getConnection();
    } finally {
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }
}

关闭连接,语句和结果集应该在它们打开时以相反的顺序发生。

如果您的实际问题是性能,请考虑使用连接池来提高连接性能,例如C3P0。顺便说一句改变一般习语。只要继续写同样的习语,连接池实现就会进一步担心。

有关更多做法/示例,请参阅this article

答案 8 :(得分:0)

执行完交易后,请务必关闭连接。在同一方法中获取和关闭连接是一种很好的做法。如果您有紧密耦合的单独事务,则可以使用相同的连接执行它们,但是为了获得最佳实践,我尝试每个连接执行一个事务。

答案 9 :(得分:0)

如果是一个选项,请不要明确搞乱连接。使用像hibernate这样的完整的orm框架,或使用像spring jdbc模板那样更轻量级的东西。

答案 10 :(得分:0)

这在某种程度上取决于您的应用程序运行的上下文。如果它是一个Web应用程序,您需要小心打开您的连接,做任何需要的工作,并快速关闭连接。但是,在C / S或批处理环境中,只要用户“经常”进行交互(对于您选择的“频繁”的任何值),获取连接并保持连接可能会更好,特别是如果用户有期望的话快速响应时间,并且(在时间或资源方面)获得与您的特定数据库的连接是昂贵的。

我喜欢每次用户让应用程序进入数据库时​​设置计时器。如果/当计时器到期时,关闭连接,然后在他/她/它想要再次访问数据库时重新打开。计时器到期时间可能在1到20分钟之间。只要它小于数据库的“不活动断开连接”时间。

分享并享受。

相关问题