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

标签 java sql-server database connection-pooling hikaricp

根据 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)。

更新:直接回答您有关固定池大小调整的问题。您可能会使用一个池从您的应用程序中获得最佳性能,该池作为最大连接数在您的数据库可以处理的“拐点”或“峰值”性能处右转。这可能是一个小数字。如果您有“峰值需求”,就像许多应用程序一样,尝试在峰值出现时启动新连接以增加池会适得其反(在服务器上创建更多负载)。一个小型的常量池将为您提供可预测的性能。

关于java - 为什么 HikariCP 推荐固定大小的池以获得更好的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28987540/

相关文章:

如果行尚不存在,MySQL SELECT 或 INSERT

mysql - 如何使用MySQL检查数据库中是否已经存在表?

java - 命令行参数显示 0?

sql-server - SQL Server SMO,应该在每次修改内容时调用刷新吗?

java - 使用自定义刷新和驱逐 java 在 DAO 上实现缓存

sql - 使用 sp_rename 重命名 SQL 表有什么好处?

sql - 存储过程的 SELECT WHERE 语句中的 CASE?

MySQL 手动更改跟踪

Java,在正则表达式中转义(使用)引号

java - Java Swing 的 JTable 样式或主题