HikariCP 的默认 maximumPoolSize 是多少?

64

当容器加载时,Spring Boot HikariCP提供的默认连接池大小是多少?

当然,我使用以下属性设置最大连接池大小,但是如果我们在application.properties文件中没有指定任何数字,我想知道默认的连接池大小是多少。

spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.poolName=SpringBootJPAHikariCP
spring.datasource.hikari.maxLifetime=2000000
spring.datasource.hikari.connectionTimeout=30000

如果我在application.properties中设置了最大池大小为100,但实际只使用了20,那么这会影响我的应用程序性能吗?


2
请参阅 https://www.baeldung.com/spring-boot-hikari 了解一些细节。 - Wim Deblauwe
也很好知道为什么执行器在actuator/env下不显示默认值。 在此处提问 https://stackoverflow.com/questions/63358741/spring-boot-actuator-doesnt-show-hikari-parameters - ka3ak
3个回答

76

8
谢谢,HikariCP最多能处理多少个连接池?这个数量是否基于JVM内存? - Hari

1
关于最大池大小,例如,PostgreSQL建议使用以下公式

pool_size = ((core_count * 2) + effective_spindle_count)
  • core_count 是 CPU 核心数量
  • effective_spindle_count 是 RAID 中磁盘的数量

但根据这些文档:

但我们相信它将在大多数数据库中适用。

这意味着这个公式通常可以适用于其他数据库。

例如,关于 Oracle 您可以阅读本文并观看视频


0

多年来,一个在许多基准测试中表现良好的公式是:为了实现最佳吞吐量,活动连接数应该接近

connections = ((core_count * 2) + effective_spindle_count).

核心计数不应包括HT线程,即使启用了超线程。如果活动数据集完全缓存,则有效磁头计数为零,并且随着缓存命中率的下降,逼近实际磁头数量。...到目前为止,还没有对SSD与此公式的适配性进行分析。

为了避免死锁,池大小的计算是一种相当简单的资源分配公式:

pool size = Tn x (Cm - 1) + 1

其中,

  • Tn是最大线程数
  • Cm是单个线程持有的最大同时连接数

例如,假设有三个线程(Tn=3),每个线程需要四个连接才能执行某些任务(Cm=4)。 为确保死锁永远不会发生,所需的池大小为:

pool size = 3 x (4 - 1) + 1 = 10

另一个例子,你最多有八个线程(Tn=8),每个线程需要三个连接来执行某些任务(Cm=3)。为了确保永远不会发生死锁,所需的池大小为:

pool size = 8 x (3 - 1) + 1 = 17

这不一定是最优的池大小,但是可以避免死锁所需的最小大小。 在某些环境中,使用JTA(Java事务管理器)可以通过将同一连接从getConnection()返回给已经在当前事务中持有连接的线程,从而显著减少所需的连接数。 我们在公司内部遇到了一些惊人的Web应用程序,其中只有几十个前端用户进行定期活动,但却有100个连接池。不要过度提供数据库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接