首页 > 解决方案 > 没有可用连接时的 HikariCP 行为

问题描述

我注意到,即使数据库已关闭,因此池中实际上没有可用的连接,Hikari CP 仍然等待连接超时到期,然后再向客户端发送异常。

我同意当数据库可用时这是可取的,但在我的情况下,我希望池在没有可用连接时发送异常之前不要等待。

原因是数据库本身在不到 2ms 的时间内回答,所以我可以每秒处理数千个事务,但是当没有可用的连接时,池将等待更长的时间(建议的最小可接受超时为 250 ms)所以我可以不再处理吞吐量。另一方面,我的逻辑可以在没有数据库的情况下工作一段时间。

我应该如何管理这个?

编辑:

这个链接几乎是我想要实现的,减去我希望 HikariCP 自动执行此操作的事实,我不应该激活挂起状态。

标签: javahikaricp

解决方案


也许您应该在应用程序代码的某处引入一个计数器,如果并发请求数超过该值,请不要使用数据库。如果不知道您在处理什么,例如读与写,就很难说清楚。

根据brettwooldridge 关于connectionTimeout属性较低超时的评论,由于线程调度,即使有可用连接也是不可靠的:

我们当然可以考虑较低的楼层,但 125 毫秒是绝对最小值。

Windows 和 Linux 的默认调度程序时间间隔均为 20 毫秒。如果在 4 核 CPU 上运行 16 个线程,则单个线程可能必须等待长达 80 毫秒才能被允许运行。例如,如果池由于连接在 maxLifetime 时退出而出现空缺,那么在不向客户端返回虚假故障的情况下,这将留下宝贵的时间来建立连接以填充插槽。

如果不仔细考虑以确保 CPU 和调度程序不会过饱和,以 125 毫秒超时运行,即使池具有可用连接,您的应用程序层也会面临虚假故障的风险。例如,在 4 核 CPU 上运行 32 个线程可能会在负载下导致线程饥饿长达 120 毫秒——非常接近边缘。


推荐阅读