簡體   English   中英

與HikariCP的連接超時

[英]Connection timeouts with HikariCP

我有一個Spring Boot(v2.0.8)應用程序,該應用程序使用配置有以下內容的HikariCP(v2.7.9)池(連接到MariaDB):

minimumIdle: 1
maximumPoolSize: 10
leakDetectionThreshold: 30000

問題是我們的生產組件每隔幾周就會反復拋出SQLTransientConnectionException " Connection is not available, request timed out after 30000ms..." 問題是它永遠不會從中恢復並始終拋出異常。 因此需要重新啟動組件。

通過查看HikariPool源代碼,似乎發生了這種情況,因為每次調用connectionBag.borrow(timeout, MILLISECONDS) ,poolEntry都為null,因此會拋出超時異常。 如果它為null,則連接池必須沒有空閑條目,即sharedList中的所有PoolEntry都標記為IN_USE

我不確定為什么組件不會從此恢復,因為最終我希望PoolEntry被標記為NOT_IN_USE ,這將打破重復的異常。

我能想到的可能場景:

  1. 所有條目都是IN_USE ,DB暫時中斷。 我希望在飛行中查詢會拋出異常。 也許在這一點上,PoolEntry狀態永遠不會被重置,因此會停留在IN_USE 在這種情況下,我會想到如果拋出異常,狀態會發生變化,以便可以從池中清除連接。 任何人都可以確認是否是這種情況?

  2. 向組件發出大量REST請求,而這些請求又需要執行DB查詢。 這將填充連接池,因此后續請求會超時等待先前的請求完成。 這是有道理的但是我希望組件在請求完成后恢復,但事實並非如此。

有沒有人知道這里可能存在什么問題? 我已經嘗試配置Hikari文檔中的各種超時,但沒有運氣診斷/解決此問題。 任何幫助,將不勝感激。

謝謝!

場景2最有可能發生的事情。 在將其與雲數據流一起使用並接收大量連接請求時,我遇到了同樣的問題。 我找到的唯一解決方案是使用配置來查找適用於我的用例的組合。

我會給你留下每秒50-100個請求的代碼,祝你好運。

private static DataSource pool;
final HikariConfig config = new HikariConfig();
config.setMinimumIdle(5);
config.setMaximumPoolSize(50);
config.setConnectionTimeout(10000);
config.setIdleTimeout(600000);
config.setMaxLifetime(1800000);
config.setJdbcUrl(JDBC_URL);
config.setUsername(JDBC_USER);
config.setPassword(JDBC_PASS);

pool = new HikariDataSource(config);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM