Java 中有多少个 JDBC 连接?

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

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

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


答案 1

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

  • 对数据库可以明智地处理多少个并发连接进行一些猜测(例如,从数据库计算机上的每个 CPU 2 或 3 个开始,直到您发现这太少或太多 - 这往往取决于查询的磁盘绑定程度)
  • 创建一个由这么多连接组成的:本质上是一个类,您可以在每个方法的开头请求“下一个空闲连接”,然后在每个方法结束时“传递回”池
  • 您的getFreeConnection()方法需要返回一个可用连接(如果可用),否则(1)创建一个新连接,最多达到您决定允许的最大连接数,或者(2)如果已经创建了最大值,请等待一个成为空闲连接
  • 我建议使用信号量类来管理连接;实际上,我在我的网站上有一篇关于使用信号量管理资源池的短文,其中有一个我认为您可以适应您的目的的示例

几个实际注意事项:

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

答案 2

您可以传入连接,也可以最好使用类似 Jakarta 数据库连接池之类的连接。http://commons.apache.org/dbcp/


推荐