Hikari setConnectionTimeout 的行为

The*_*heo 0 hikaricp

只是在寻找这段代码的基本原理解释(PoolUtiltites:293 in version 2.2.4):

dataSource.setLoginTimeout((int) TimeUnit.MILLISECONDS.toSeconds(Math.min(1000L, connectionTimeout)));
Run Code Online (Sandbox Code Playgroud)

这段代码和 setConnectionTimeout 方法意味着我得到了这种行为:

  • connectionTimeout == 0,然后 loginTimeout = Integer.MAX_VALUE
  • connectionTimeout > 0 && < 100,然后 HikariConfig 抛出 IllegalArgumentException
  • connectionTimeout >= 100 && <= 1000,然后 loginTimeout = connectionTimeout
  • connectionTeimout > 1000,则 loginTimeout = 1000

这对我来说真的很奇怪!

这几乎就像 Math.min 应该是 Math.max ???

在我当前的项目中,我希望在 30 秒后连接失败,这在当前设置中是不可能的。

我使用的是 4.1 postgres jdbc 驱动程序,但我认为这与上述问题无关。

非常感谢 - 还有很酷的池库!!!

bre*_*ttw 5

好的,这里有几个活动部分。首先,Math.min()是一个bug,应该是Math.max()。鉴于此(它将被修复),请考虑以下事项:

需要注意的是,连接是在池中异步创建的。本setConnectionTimeout()集的最大时间(毫秒)调用getConnection()会等待超时前的连接。

DataSourceloginTimeout是启动到数据库的物理连接在超时之前可以花费的最长时间。由于 HikariCP 是异步获取连接的,如果连接尝试失败,HikariCP 将继续重试,但您对 的调用getConnection()将适当超时。我们使用 connectionTimeout 对loginTimeout.

例如,假设池完全为空,并且您配置了connectionTimeout30 秒。当您调用getConnection()HikariCP 时,意识到没有可用的空闲连接,开始尝试获取新连接。loginTimeout在这种情况下,超过 30 秒毫无意义。

该的目的Math.max()调用,以确保我们从来没有loginTimeout0如果用户已配置connectionTimeout250msTimeUnit.MILLESECONDS.toSeconds()将返回0Math.max()。如果用户已经配置connectionTimeout0,这意味着他们再也不想超时的时间转换Integer.MAX_VALUE结果在几千年的超时(几乎从不)。

话虽如此,鉴于 HikariCP 与数据库的连接是如何异步获取的,即使没有Math.max()修复,您也应该能够实现 30 秒的应用程序级连接超时。除非与您的数据库的物理连接超过 1000 毫秒,否则您不会受到Math.min().

我们将在接下来的几个小时内发布 2.2.5-rc3 候选版本。我将插入此修复程序。