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

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

最小Idle

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

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

如果我创建一个 200 个连接固定大小的池,大多数情况下,100 个连接将处于空闲状态。

那么以下哪项是最好的:

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

  1. 通过设置为 100 和 200 来创建连接池。minimumIdlemaximumPoolSize

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


答案 1

我建议您阅读此页面并观看随附的视频。Oracle 性能组演示了具有 96 个连接池的应用如何轻松地处理 10,000 个前端用户和每秒 20,000 个事务。

PostgreSQL推荐了一个公式:

connections = ((core_count * 2) + effective_spindle_count)

其中 是 CPU 内核,是 RAID 中的磁盘数。对于许多服务器,此公式将导致最多 10-20 个连接的连接池。core_counteffective_spindle_count

很有可能,即使有100个连接,您的数据库也会严重过度饱和。你有 50 个 CPU 内核吗?如果您的驱动器是旋转的盘片而不是SSD,则磁头一次只能在一个地方,除非整个数据集都在内存中,否则无法同时处理这么多请求(100-200)。

更新:直接回答您关于固定池大小的问题。您可能会从应用程序获得最佳性能,并且池的最大连接计数在数据库可以处理的“膝盖”或“峰值”性能处右转。这可能是一个小数字。如果您有“峰值需求”,就像许多应用程序一样,尝试在峰值的那一刻启动新连接以增加池会适得其反(在服务器上产生更多负载)。一个小的、恒定的池将为您提供可预测的性能。


答案 2

这实际上取决于运行长时间运行和短期运行事务的应用程序行为。有时我觉得,如果我们想以客户端同步方式响应,最好将一些空闲连接保持在池中。


推荐