java - 仅当池已满时 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 中寻找的行为?
解决方案
推荐阅读
- java - 如何通过命令行为 jfr 启用堆指标
- lumen - 流明路线参数不适用于点
- java - 在 IBM Websphere 上部署 WAR
- perl - .perldb(Perl 调试器)中用于表达式评估“x”的别名定义不起作用
- image - 如何将半径应用于颤动的图像?
- c# - 为什么默认系统日期时间与 PersianCalendar 之间的转换不起作用?
- python - 集成语音识别和 tkinter
- rpmbuild - 创建 RPM 更新时更改文件成员
- tar - 使用 docker Alpine 时出现“tar: not found in archive”错误
- python - 由于条目,Python中未在Label中定义字符串