我啥时候必须关闭数据库连接? (爪哇)

Posted

技术标签:

【中文标题】我啥时候必须关闭数据库连接? (爪哇)【英文标题】:When must I close database connections? (Java)我什么时候必须关闭数据库连接? (爪哇) 【发布时间】:2014-04-10 05:41:01 【问题描述】:

所以我有一个作为 TCP 服务器无限期运行的 Java 进程(从另一个进程接收消息,并具有 onMsg 处理程序)。

我想在我的 Java 程序中处理消息的其中一件事是使用与 postgres 的数据库连接将其写入磁盘。现在,我有一个静态连接对象,每次收到消息时都会调用它。我不会关闭并重新打开每条消息的连接。

我对 Java 还是有点陌生​​,我想知道 1) 使用一个无限期打开的连接对象是否有任何陷阱或危险,以及 2) 从不关闭连接而不是重新打开连接是否有性能优势/close 每次我想访问数据库?

感谢您的帮助!

【问题讨论】:

查看this 答案。虽然这是针对 php 的,但它仍然会回答为什么保持不必要的连接打开是不好的。 【参考方案1】:

我不会为每条消息关闭并重新打开连接。

是的……至少就普通的Connection 对象而言。否则,如果您最终连接断开,它将永远断开,并且如果您需要同时执行多个操作,您就会遇到问题。

您想要的是一个连接池来管理与数据库的“真实”连接,您只需为每个操作从池中请求一个连接,并在完成后关闭它。关闭“逻辑”连接只会将“真实”连接返回到池中以进行另一个操作。 (池可以处理通过心跳保持连接活动,随着时间的推移退出连接等)

有很多可用的连接池技术,而且我已经很长时间没有使用“普通”JDBC,所以我不想说目前最先进的技术 - 但那是你的研究可以自己做:)

【讨论】:

【参考方案2】:

创建数据库连接总是会影响性能。只有非常幼稚的实现才会为每个操作创建和关闭连接。如果你只需要一个小时做一次,那是可以接受的。

但是,如果您的程序每分钟执行几次数据库访问(对于较大的应用程序,甚至每秒执行一次),您并不想真正关闭连接。

那么你什么时候关闭连接?简单的答案:让连接池为您处理。你向池请求一个连接,它会给你一个打开的连接(它要么已经缓存,或者如果它真的需要,一个全新的连接)。完成查询后,您 close() 连接,但实际上它只是将连接返回到池。

对于非常简单的程序,设置连接池可能需要额外的工作,但这并不是很困难,而且绝对是您想要掌握的窍门。有几个开源的连接池,比如来自Apache的DBCP3CPO

【讨论】:

以上是关于我啥时候必须关闭数据库连接? (爪哇)的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候需要处理(服务器-客户端)对象?

我啥时候应该使用助手? [关闭]

我啥时候应该参加内部课程[关闭]

MySQLi 查询结果:我啥时候关闭、空闲或两者都关闭?

我啥时候开始看到付款? [关闭]

我啥时候应该销毁令牌[关闭]