HikariConfig 和 maxPoolSize

HikariConfig and maxPoolSize

我在 spring 服务器上使用 HikariConfig 作为 postgres 数据库的数据源。 我应该设置 maxPoolSize 吗? (默认值为 -1) 我可以使用多少池大小? 是否与硬件有任何依赖关系?

maxPoolSize 是一个指标,作为您应用程序的限制。您应该根据流量/应用程序的开销/硬件来计算。 F.E 您可以将限制设置为 10000 个连接,这并不意味着它将按预期运行。实际上这会受到您的硬件的影响,因为如果您的机器包含一个核心,那么 100000 个活动连接将同时拉伸 java 应用程序和 postgres,因为 OS 将难以处理所有这些 I/O 来电。更糟糕的是,如果数据库和 java 应用程序位于同一网络中的不同机器上,您还会有网络开销。

真正优化性能的是 minimumIdle 属性 和 idleTimeout ,所以如果你已经为这些计算了一个合适的值,那么它永远不会达到 maxConnection 值以及由于锁等待或资源匮乏导致的开销。这里唯一不好的是,如果您的应用程序设计错误(f.e。保持连接的时间超过需要的时间,没有正确提交事务,没有使用批处理作业进行长时间操作),那么它将影响用户的体验,但这是另一个问题。

i)

Should I set up maxPoolSize? (default value is -1)


您应该将其设置为全局限制,以便您的应用程序和数据库都可维护且健康。默认值不是 -1 而是 10。更多详细信息 here

ii)

How much pool size can i use?


这取决于您的应用程序和基础架构。获得这些数字的唯一方法是对最复杂的用例进行集成测试。 关于 postgres 调整的一些信息 here

iii)

Are there any dependencies with hardware?


是的,对于 JVM 和 Postgres 服务器,不仅从硬件的角度来看,还有你可能选择的 OS

我来到这里是因为我也想了解 maxPoolSize 和 minIdle 的默认值 -1 是什么意思。在 HikariConfig 的内部,这两个属性都默认为 -1。 Hikari 代码将这些值与文档中公开宣传的默认值相协调。

public HikariConfig()
{
    dataSourceProperties = new Properties();
    healthCheckProperties = new Properties();

    minIdle = -1;
    maxPoolSize = -1;
    maxLifetime = MAX_LIFETIME;
    ...

然后将这些值设置为:

    if (maxPoolSize < 1) {
      maxPoolSize = DEFAULT_POOL_SIZE;
    }

    if (minIdle < 0 || minIdle > maxPoolSize) {
      minIdle = maxPoolSize;
    }

无意直接回答 OP 的问题,只是为可能登陆此处寻找 -1 含义的其他人增加清晰度。