首页 > 解决方案 > 仅当池已满时 Hikari 连接超时

问题描述

我正在将应用程序的数据库连接池从 Apache 的 DBCP2 转换为 Hikari。到目前为止,一切看起来都很好,除了我遇到了 Hikari 的connectionTimeout财产问题。这是一个流量相当大的 Web 应用程序,我们的首选行为是在池已满时快速抛出错误,这样某种流量的峰值不会占用我们所有等待的请求处理线程连接。我们宁愿让这些请求出错,因为我们的绝大多数流量将在以后根据需要重试。

对于 DBCP2,我们目前将maxWaitMillis属性设置为 1 秒。HikariconnectionTimeout似乎与此等效,因此我也尝试将其设置为 1 秒。

但是,当我这样做时,我开始收到“登录超时”SQLException。如果我改connectionTimeout回默认的 30 秒,问题就会消失。

重新阅读文档,这些属性之间似乎存在细微差别。

光的connectionTimeout

此属性控制客户端(即您)将等待来自池的连接的最大毫秒数。如果在没有可用连接的情况下超过此时间,将引发 SQLException。可接受的最低连接超时为 250 毫秒。默认值:30000(30 秒)

DBCP2 maxWaitMillis

池将等待(当没有可用连接时)在抛出异常之前返回连接的最大毫秒数,或 -1 无限期等待。

似乎在 DBCP2 中,maxWaitMillis只有在池已满时尝试借用连接时才会启动计时器。HikariconnectionTimeout适用于借用连接的任何场景,这意味着它也适用于池未满且必须打开新连接的情况。在这种情况下,打开一个新连接的时间超过 1 秒,这就是抛出 SQLException 的原因。

我更喜欢 DBCP2 的方法。如果我要打开一个新连接,请尽可能多地使用。池中可用的连接数量有限,因此最多maximumPoolSize可能有多个线程在等待。但是,如果池用尽,我不希望线程等待,因为可能有无限数量的线程等待从池中借用连接。这些似乎是非常不同的情况,应该允许不同的超时。

有什么方法可以实现我在 Hikari 中寻找的行为?

标签: javahikaricpapache-commons-dbcp

解决方案


推荐阅读