java - 给定基础数据库最大连接设置的 java 最佳 jdbc 池大小
问题描述
我试图了解应用程序中的连接池。
假设我们使用 max_connections=100 的 postgresql 数据库,我的 java(或其他语言)应用程序中连接池大小的最佳值应该是多少?
使用大于 的 java jdbc 连接池大小是否有意义
max_connections
?在执行查询后关闭(释放)连接是个好主意吗?或者最好让连接打开(以便我们可以重用它)?
解决方案
您的最大连接池大小应小于配置(如果您的应用程序在多个节点上max_connections
运行,请考虑所有节点的总大小!)。您不想冒管理员或维护工具无法连接到数据库的风险,因为您的应用程序的所有连接都在使用中。
配置绝对不应该高于max_connections
,因为如果连接池试图分配超出服务器最大值的连接,那只会导致错误。
事实上,根据您的应用程序需求,您可能会使用非常小的连接池(可能 5 或 10 个连接),但请记住,更多的连接并不总是更好。您需要测试什么对您的应用程序有意义,因为我们不能只说“这是所有情况下的最佳配置”。
至于您的第二个问题:关闭符合 JDBC 的连接池中的连接是将连接返回到连接池以供重用。因此,您应该关闭连接,并且不要将其打开太久。不关闭连接或保持连接打开时间过长,会使池饥饿,这意味着它需要打开更多连接(或耗尽池)才能为您的应用程序提供足够的连接。
连接池创建物理连接并将它们放入池中。当您的应用程序代码从池中请求连接时,连接池会“检出”一个物理连接,将其包装在一个逻辑连接中并将逻辑连接返回给您的应用程序代码。
当您的应用程序代码关闭该逻辑连接时,它会向连接池发出信号,表明该物理连接可供重用。然后,池要么将物理连接返回到池,要么可能因为池已经有太多空闲连接、连接太旧或其他验证原因而关闭它。关闭后,逻辑连接和派生对象(如语句和结果集)表现(或应该表现)为已关闭(即:不能再使用)。
您的代码应在工作单元完成后立即关闭连接,并且工作单元应尽可能小,但不能小到导致行为中断(例如,您不应该提交工作并在中间关闭连接,而预期的应用程序行为要求后续工作应该在同一个事务中)。
推荐阅读
- java - 将 Spring Boot 从 2.1.5 升级到 2.1.6 时出现问题,似乎没有正确/以正确的顺序删除数据
- android - 以编程方式删除 Android 中的 *.* 本地文件
- javascript - 简单地从 api 渲染数据
- java - 搜索/过滤器的 Spring REST API 设计
- javascript - 设置为显示后如何更改显示属性的值:无
- java - 如何在 WebApplication Maven 项目中配置 pom?
- javascript - Javascript 使用 msgreader 的附件提取并上传到 Azure blob 存储
- spring-boot - 如何以编程方式进行 JHipster Springboot 配置?
- gnuplot - 如何使gnuplot忽略stat命令中的时间列
- reactjs - 如何根据对象值将类名添加到地图数组中的列表