为什么 HikariCP 推荐固定大小的池以获得更好的性能

Why does HikariCP recommend fixed size pool for better performance

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

minimumIdle:

This property controls the minimum number of idle connections that HikariCP tries to maintain in the pool.If the idle connections dip below this value, HikariCP will make a best effort to add additional connections quickly and efficiently. However, for maximum performance and responsiveness to spike demands, we recommend not setting this value and instead allowing HikariCP to act as a fixed size connection pool. Default: same as maximumPoolSize

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

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

那么下面哪个是最好的:

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

  1. 通过将 minimumIdle 设置为 100 并将 maximumPoolSize 设置为 200 创建连接池。

为什么HikariCP不推荐第二点?我认为第二个最适合我的情况。

我建议您 read this 页面并观看附加视频。 Oracle Performance Group 演示了具有 96 个连接池的应用程序如何轻松处理每秒 10,000 个前端用户和 20,000 个事务。

PostgreSQL 推荐的公式为:

connections = ((core_count * 2) + effective_spindle_count)

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

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

更新:直接回答您有关固定池大小调整的问题。您可能会从您的应用程序中获得最佳性能,因为最大连接数在您的数据库可以处理的 "knee" 或 "peak" 性能处右转。这可能是一个小数字。如果您有 "spike demand",就像许多应用程序一样,尝试启动新连接以在峰值瞬间增加池会适得其反(在 更多 负载服务器)。一个小的常量池将为您提供可预测的性能。

这实际上取决于 运行 多头 运行 和空头 运行 交易的应用程序行为。有时我觉得如果我们想以客户端同步的方式响应,最好保留一些空闲连接到池中。