首页 > 解决方案 > 给定基础数据库最大连接设置的 java 最佳 jdbc 池大小

问题描述

我试图了解应用程序中的连接池。

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

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

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

标签: javapostgresqljdbcdatabase-connectionconnection-pooling

解决方案


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

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

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

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

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

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

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


推荐阅读