当前位置: 首页 > 知识库问答 >
问题:

无可用连接时的 HikariCP 行为

毛缪文
2023-03-14

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

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

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

我应该如何处理这个问题?

编辑:

这个链接几乎是我想要实现的,减去我更喜欢HikariCP自动做到这一点的事实,我不应该激活挂起状态。

共有1个答案

仰翔
2023-03-14

也许你应该在你的应用程序代码中引入一个计数器,如果并发请求的数量超过了这个值,就不要使用数据库。如果不知道您在处理什么,很难判断,例如读还是写。

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

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

Windows和Linux都有默认的20毫秒调度时间。如果16个线程在4核CPU上运行,则单个线程可能需要等待80毫秒才能运行。例如,如果池由于maxLifetime的连接失效而出现空缺,则这会留下宝贵的时间来建立连接以填充插槽,而不会向客户端返回虚假故障。

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

 类似资料:
  • 我们的项目中有Spring-boot/hibernate/PostgreSQL应用程序,并使用Hikari作为连接池。我们不断遇到以下问题:几个小时后,活动连接数增长到极限,我们得到如下错误(完整堆栈跟踪位于问题的末尾): 以下是版本信息: JPA/Hibernate配置: HikariCP配置: 完整堆栈跟踪:

  • 我有一个Spring Boot(v2.0.8)应用程序,它使用HikariCP(v2.7.9)池(连接到MariaDB)配置: 问题在于,我们的生产组件每隔几周就会反复抛出 。问题在于它永远不会从中恢复,并且会不断引发异常。因此,需要重新启动计算装置。 从HikariPool源代码来看,这似乎正在发生,因为每次它调用poolEntry都是空的,因此会抛出超时异常。要使其为空,连接池必须没有空闲条目

  • 我已经掌握了java.sql。SQLTransientConnectionException:springHikariCP-连接不可用,请求在30001ms后超时。 第一个代码块工作良好,第二个(CP)不工作。 什么是错的,如何解决这个问题? JDK - 1.8.0_73。 HikariCP-2.4.5。 Spring4.2.5。释放。 大脑性麻痹

  • 我尝试使用HikariCP和mariaDB数据库,但是当我尝试初始化的时候,我得到了下一个错误。 由以下原因引起:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 我的MariaDBDatabase类: 我的数据库类: 我的家伙.xml

  • 我正在开发一个在Java服务器上运行的游戏。对于数据库池,我使用的是HikariCP,这是一个优秀的库,但它现在抛出了以下错误: 现在我知道连接泄漏意味着打开的连接在某个地方漂浮,但我不知道如何或在哪里漂浮。 下面是我的数据库类中的一个方法,根据堆栈跟踪,错误应该发生在这里。 这只是启动语句的一个基本方法。调用它时,我使用它,然后调用、和 但它告诉我连接是打开的。 我怎么解决这个?谢了!

  • 我正在使用hikaricp(这可能也适用于任何其他数据库连接池)。我有一个DBPool类,在其中我实例化了一个HikariDataSource(使用HikariConfig对象)。对于这个DBPool,我使用lazyholder习惯用法来限制每个VM一个池实例。但是,一旦获得对池的引用,就可以检索连接对象(无需任何进一步的锁/同步/信号量检查),因为我认为连接池会处理我的连接对象限制。每次通过数据