一尘不染

Java中有多少个JDBC连接?

java

我有一个由15种方法组成的Java程序。并且,这些方法在程序执行过程中非常频繁地被调用。目前,我正在每种方法中创建一个新连接并调用它们上的语句(数据库在网络上的另一台计算机上设置)。

我想知道的是:我应该只在main方法中创建一个连接并将其作为参数传递给需要连接对象的所有方法,因为这将大大减少程序中的连接对象数量,而不是创建在每种方法中都非常频繁地关闭连接。

我怀疑我在当前设计中不能非常有效地利用资源,并且考虑到该程序将来可能会增长很多,因此还有很多改进的余地。


阅读 226

收藏
2020-12-03

共1个答案

一尘不染

是的,您应该考虑重新使用连接,而不是每次都创建一个新的连接。通常的过程是:

  • 对数据库可以合理地处理多少个同时连接进行一些猜测(例如,在数据库机上,每个CPU以2个或3个CPU开始,直到您发现它太少或太多-这将取决于磁盘的数量)绑定您的查询)
  • 创建一个包含这么多连接的 :本质上是一个类,您可以在每个方法的开头请求“下一个空闲连接”,然后在每个方法的末尾“传递”回池
  • 如果一个可用,您的getFreeConnection()方法需要返回一个空闲连接,否则(1)创建一个新连接,其数量不超过您决定允许的最大连接数量,或者(2)如果已经创建了最大数量的连接,等一个免费
  • 我建议使用Semaphore类来管理连接。我的网站上确实有一篇简短的文章,内容涉及使用信号量管理资源池的示例,我认为您可以适应您的目的

一些实际考虑:

  • 为了获得最佳性能,您需要小心, 不要在没有真正使用连接来运行查询的同时“挂住”连接 。如果您从池中建立一次连接,然后将其传递给各种方法,则需要确保您不会意外地这样做。
  • 不要忘记将您的连接返回到池中!(尝试/最后是您的朋友在这里…)
  • 在许多系统上,您 无法使连接永远保持打开状态 :操作系统会在一段时间后将其关闭。因此,在“将连接返回到池”方法中,您需要考虑 已经存在很长时间的“退休”连接 (建立某种记忆机制,例如,通过在实际的JDBC周围使用 包装器对象 可用于存储指标的连接对象
  • 您可能要考虑使用准备好的语句。
  • 随着时间的流逝,您可能需要 调整连接池的大小
2020-12-03