Connection-Pooling
用於 VM 部署的連接池庫的選擇
HickariCP 文件說:
HikariCP 在性能和可靠性方面都非常依賴準確的高解析度計時器。您的伺服器必須與時間源(例如 NTP 伺服器)同步。特別是如果您的伺服器在虛擬機中執行。不要依賴管理程序設置來“同步”虛擬機的時鐘。在虛擬機內部配置時間源同步。如果你在一個被證明是由於缺乏時間同步引起的問題上尋求支持,你將在 Twitter 上被公開嘲諷。
您會選擇哪些其他連接池庫,它們對虛擬機時間漂移不太敏感?
在時間可以向後或向前跳躍的環境中的任何池,它可以在虛擬機中,當它這樣做時將受到虛假故障的影響。
此外,受影響的不僅僅是連接池。
任何…
- 定時等待
- 來自並發集合的定時輪詢
- Object.wait() 超時
- Thread.sleep() 呼叫
- …
- Java 中任何需要測量時間的東西都會受到影響。
如果您無法確定時鐘漂移,您將遇到無法解釋的應用程序故障,發生在您的程式碼和第三方庫中。
HikariCP(即我)厭倦了花費數小時解決使用者問題、閱讀日誌和執行緒轉儲,卻發現他們的時鐘前後跳動超過一分鐘。
使用者:“為什麼我會收到一堆連接超時?!”
(幾天來來回回的問題和稍後檢查日誌……)
HikariCP:“嗯,你要求池嘗試 30 秒來給你一個連接……然後你的時鐘向前跳了 42 秒,Java(和作業系統)釋放所有執行緒,就好像時間真的過去了一樣。”
修復起來非常簡單,只需在 VM 中配置 NTP。