java 最佳 jdbc 给定底层数据库最大连接设置的池大小

java optimum jdbc pool size given a Underlying database max connection setting

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

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

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

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

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

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

事实上,根据您的应用程序需求,您可能可以使用非常小的连接池(可能是 5 或 10 个连接),但请记住,连接数越多并不总是越好。您需要测试什么对您的应用程序有意义,因为我们不能只说 "this is the best configuration in all situations".

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

连接池创建物理连接并将它们放入池中。当您的应用程序代码从池中请求连接时,连接池 'checks out' 一个物理连接,将其包装在一个逻辑连接中,并 return 将逻辑连接连接到您的应用程序代码。

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

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