【问题标题】:java optimum jdbc pool size given a Underlying database max connection setting给定基础数据库最大连接设置的 java 最佳 jdbc 池大小
【发布时间】:2020-04-01 10:06:22
【问题描述】:

我正在尝试了解应用程序中的连接池。

假设我们使用 max_connections=100 的 postgresql 数据库,在我的 java(或其他语言)应用程序中,连接池大小的最佳值应该是多少?

  1. 使用大于max_connections 的java jdbc 连接池大小是否有意义?

  2. 在查询执行后立即关闭(释放)连接是个好主意吗?或者最好让连接打开(以便我们可以重用它)?

【问题讨论】:

  • 1. 2. 关闭它会将其释放回池中。如果你不关闭它,就没有pooling。
  • 这里的“下划线”是什么意思?底层证券?
  • 是的,对不起我的英语不好。我已经改正了

标签: java postgresql jdbc database-connection connection-pooling


【解决方案1】:

您的最大连接池大小应低于max_connections 配置(如果您的应用程序在多个节点上运行,请考虑所有节点的总大小!)。您不想冒管理员或维护工具无法连接到数据库的风险,因为您的应用程序的所有连接都在使用中。

配置绝对不应该高于max_connections,因为如果连接池试图分配超过服务器最大值的连接,那只会导致错误。

事实上,根据您的应用程序需求,您可能会使用非常小的连接池(可能 5 或 10 个连接),但请记住,更多的连接并不总是更好。您需要测试什么对您的应用程序有意义,因为我们不能只说“这是所有情况下的最佳配置”

关于您的第二个问题:关闭符合 JDBC 的连接池中的连接是将连接返回到连接池以供重用。因此,您应该关闭连接,并且不要将其打开太久。不关闭连接或保持连接打开的时间过长,会使池饥饿,这意味着它需要打开更多连接(或耗尽池)才能为您的应用程序提供足够的连接。

连接池创建物理连接并将它们放入池中。当您的应用程序代码从池中请求连接时,连接池会“检出”一个物理连接,将其包装在一个逻辑连接中并将逻辑连接返回给您的应用程序代码。

当您的应用程序代码关闭该逻辑连接时,它会向连接池发出信号,表明该物理连接可供重用。然后,池要么将物理连接返回到池,要么可能因为池已经有太多空闲连接,或者连接太旧,或者其他验证原因而关闭它。关闭后,逻辑连接和派生对象(如语句和结果集)表现(或应该表现)为已关闭(即:不能再使用)。

您的代码应在工作单元完成后立即关闭连接,并且工作单元应尽可能小,但不能小到导致行为中断(例如,您不应该t 提交工作并在某事中间关闭连接,而预期的应用程序行为要求后续工作应该在同一个事务中)。

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 2012-04-30
    • 2020-01-02
    • 2011-08-13
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多