为什么HikariCP建议使用固定大小的池以获得更好的性能

shi*_*han 13 java database sql-server connection-pooling hikaricp

根据HikariCP的文档,他们提到创建固定大小的池以获得更好的性能.

minimumIdle:

此属性控制HikariCP尝试在池中维护的最小空闲连接数.如果空闲连接低于此值,HikariCP将尽最大努力快速有效地添加其他连接.但是,为了获得最高性能和对峰值需求的响应,我们建议不要设置此值,而是允许HikariCP充当固定大小的连接池.默认值:相同maximumPoolSize

我的应用程序通常需要100个连接,并且仅在少数情况下达到200个连接.

如果我创建一个200连接固定大小的池,大多数时候100个连接将是空闲的.

那么以下哪一项是最好的:

  1. 创建固定大小的连接池.即200

要么

  1. 通过设置minimumIdle为100和maximumPoolSize200 来创建连接池.

为什么HikariCP不推荐第二点?我认为第二个对我来说是最好的.

bre*_*ttw 20

我建议你阅读本页并观看附带的视频.Oracle Performance Group演示了具有96连接池的应用程序如何轻松处理10,000个前端用户和每秒20,000个事务.

PostgreSQL建议使用以下公式:

connections = ((core_count * 2) + effective_spindle_count)

core_countCPU核心在哪里,effective_spindle_count是RAID中的磁盘数量.对于许多服务器,此公式将导致最大连接数为10-20的连接池.

可能性甚至是100个连接,您的数据库严重过饱.你有50个CPU核心吗?如果您的驱动器正在旋转盘片而不是SSD,那么头部一次只能在一个地方,除非整个数据集在内存中,否则无法一次为这么多请求服务(100-200).

更新:直接回答有关固定池大小调整的问题.您可能会从应用程序中获得最佳性能,其中最大连接数在您的数据库可以处理的"拐点"或"峰值"性能上变为正确.这可能是一个很小的数字.如果你有许多应用程序所做的"高峰需求",那么尝试启动新连接以在峰值瞬间增加池是适得其反的(在服务器上产生更多负载).一个小而恒定的池将为您提供可预测的性能.

  • 如果你觉得你需要运行200个连接,但100个通常是空闲的,我建议你运行一个非固定大小的池(``minimumIdle = 100``,``maximumPoolSize = 200``).但是,我还建议您重新评估您是否真的需要最多100个连接.大多数查询都非常快,因此即使线程等待连接,它们通常也不会等待很长时间(毫秒). (2认同)
  • @AshishSingh如果您有长时间运行的事务,并且大部分是非交互式工作负载,那么可能需要使用非固定大小的池。然而,关于 100 个连接的最初问题非常可疑,因为大多数服务器除非具有 50 个或更多核心以及基于闪存的存储,否则实际上无法同时处理 100 个以上的查询。 (2认同)