为 VM 部署选择连接池库

mat*_*att 9 connection-pooling

HickariCP 文档说:

HikariCP 在性能和可靠性方面都非常依赖精确的高分辨率计时器。您的服务器必须与时间源(例如 NTP 服务器)同步。特别是如果您的服务器在虚拟机中运行。不要依赖管理程序设置来“同步”虚拟机的时钟。在虚拟机内配置时间源同步。如果你来寻求支持,但结果证明是由于缺乏时间同步导致的,你会在 Twitter 上公开受到嘲讽。

您会选择其他哪些对虚拟机时间漂移不太敏感的连接池库?

bre*_*ttw 21

时间可以倒流或向前流动的环境中的任何池(在虚拟机中都可以),当它这样做时将遭受虚假故障。

此外,受到影响的不仅仅是连接池。

任何...

  • 定时等待
  • 来自并发集合的定时轮询
  • Object.wait() 超时
  • Thread.sleep() 调用
  • ...
  • Java 中需要测量时间的任何内容都会受到影响。

如果您无法确定时钟漂移,您将遇到无法解释的应用程序故障,这些故障发生在您的代码和第三方库中。

HikariCP(即)厌倦了花费数小时解决用户问题、阅读日志和线程转储,却发现他们的时钟向后或向前跳了超过一分钟。

用户:“为什么我会收到一堆连接超时?!”

(几天的来回问题和稍后检查日志......)

HikariCP:“好吧,你让池尝试 30 秒给你一个连接......然后你的时钟向前跳了 42 秒,Java(和操作系统)解除了所有线程的停放,就好像时间真的过去了一样。”

这是真的简单修复,只是配置NTP您的虚拟机内。

  • 如果您的出站访问被阻止,是的。否则,有数百个公共 NTP 服务器。但几乎所有的基础设施提供商都有 NTP 服务。请参阅 http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html (2认同)
  • @JurajMartinka 需要明确的是,与大多数 Java 代码一样,HikariCP 依赖于 Java API 的行为,例如 LockSupport.parkNanos() 或带有超时的集合 poll() 方法。JVM 在幕后使用的时间测量机制应该被认为是不透明的。通常,预期的精度为秒级。但是,根据 NTP 规范,超过 128 毫秒的逆行时间移动将引发 HikariCP 记录投诉,并驱逐和重新建立连接。 (2认同)