java - Java中有多少个JDBC连接?

标签 java performance jdbc database-connection

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

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

我怀疑我目前的设计并没有非常有效地使用资源,并且考虑到该程序将来可能会增长很多,还有很大的改进空间。

最佳答案

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

  • 猜测您的数据库可以合理地处理多少个同时连接(例如,从数据库机器上的每个 CPU 2 或 3 个开始,直到您发现这太少或太多 - 这往往取决于关于您的查询是如何受磁盘限制的)
  • 为这么多连接创建一个:本质上是一个类,您可以在每个方法开始时请求“下一个空闲连接”,然后在最后“传回”到池中每种方法的
  • 如果有可用连接,您的 getFreeConnection() 方法需要返回一个空闲连接,否则 (1) 创建一个新连接,直到您决定允许的最大连接数,或者 (2) 如果最大已创建,请等待其中一个免费
  • 我建议使用 Semaphore 类来管理连接;实际上,我的网站上有一篇简短的文章 managing a resource pool with a Semaphore举个例子,我认为你可以适应你的目的

几个实际考虑:

  • 为了获得最佳性能,您需要小心在您没有实际使用连接来运行查询时不要“占用”连接。如果您从池中获取一次连接,然后将其传递给各种方法,则需要确保您不会意外地这样做。
  • 不要忘记将您的连接返回到池中! (试试/终于是你的 friend 了……)
  • 在许多系统上,您无法“永远”保持连接打开:操作系统会在一段时间后关闭它们。因此,在您的“将连接返回到池”方法中,您需要考虑 “退出”已经存在很长时间的连接(建立一些内存机制,例如通过一个围绕实际 JDBC Connection 对象的包装器对象,您可以使用它来存储诸如此类的指标)
  • 您可能需要考虑使用准备好的语句。
  • 随着时间的推移,您可能需要调整连接池大小

关于java - Java中有多少个JDBC连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/471745/

相关文章:

java - 这是编译或反编译的副作用吗?

java - 如何在 Java 中计算时间跨度并格式化输出?

php - 高效构建 MySQL 查询

java - 使用 jdk 1.6 部署 war alltough 时获取 "Unsupported major.minor version 51.0"

java - 使用 SSH 和本地端口转发在 JAVA 中连接 Oracle 云数据库

java - ProGuard 与 maven-android-plugin

java - 如何在Activity运行时一步步画线位图

wordpress - GTMetrix Wordpress 速度问题

制作棋盘时的 JavaScript 性能

java - 从文件流导入 H2 CSV