0

我看到閒置連接沒有被清除。我不確定是什麼原因?DBCP2 BasicDataSource空閒連接沒有得到清除

INITIALSIZE-10 maxtotal-20 了maxidle-10 minidle-0 minEvictableIdleTimeMillis-30分鐘 numTestsPerEvictionRun-60分鐘 numTestsPerEvictionRun-20從雙 testOnBorrow真 testWhileIdle真 validationQuery選1

從各種來源提供的以下是我的理解 到數據源的maxtotal-maxactive連接,在上述情況下爲20個

maxidle-可以保留在池中的空閒連接的數量。這些被清掃器清除。在上述情況下,如果連接閒置30分鐘,則連接處於空閒狀態。如果清掃機每60分鐘運行一次,檢查20個空閒連接並清空空閒連接。空閒連接超過此將立即關閉。

上述理解是否正確?

我使用BasicDataSourceMXBean打印統計

{ 「NumActive」: 「0」, 「NumIdle」: 「10」, 「isClosed」: 「假」, 「maxTotal」: 「20」,」 MaxIdle「:」10「,」MinIdle「:」0「}

即使沒有流量,空閒連接永遠也不會被清除。上述配置有什麼問題嗎?

什麼是minIdle,什麼時候應該將它設置爲非零值?

最近升級的hibernate版本從3.6.0.Final到hibernate 4.3.11.Final和spring從老版本到4.2.9。

之前的空閒連接正在被清除。但是自從升級以來,空閒連接並沒有被清除。

+0

你確定該設置不應該是'testWhileIdle'而不是'testOnIdle',因爲空閒連接被驅逐? – Naros

回答

0

到處都是我看過的,看來財產應該是testWhileIdle而不是testOnIdle。該設置默認爲false,因此您的空閒線程未被驗證有效性,因此不會被驅逐。

minIdle基本上告訴連接池有多少空閒線程是允許的。我從文檔中瞭解到,當minIdle0時,應該沒有空閒連接。

通常minIdle的默認值與initialSize的默認值相同。

+0

其testWhileIdle。我仍然不明白爲什麼在90分鐘後有空閒連接。有沒有空閒連接永遠不會被清除的情況? – Anonymous7

0

我看到空閒連接沒有被清除。我不確定 原因是什麼?

https://commons.apache.org/proper/commons-dbcp/configuration.html

的testWhileIdle與testOnIdle問題,其他人已經指出,應該可以解決你的問題,爲什麼空閒連接保持打開狀態。假設initialSize = 10連接將在60分鐘時間被驅逐清理器清除,以使您降至minIdle = 0,這是正確的。爲什麼你想要一個minIdle = 0是一個不同的問題?整個連接池的關鍵在於預先進行身份驗證,測試和建立連接,以便他們可以坐在游泳池中「空閒」並可用於傳入請求的「借用」。這通過將執行時間僅減少到SQL會話來提高性能。

什麼是minIdle,什麼時候應該將它設置爲非零值?

這些空閒連接將預先建立並保持等待您未來的SQL請求。 minIdle大小取決於您的應用程序,但DBCP2的默認值爲8,可能不是一個不好的起點。這個想法是保持足夠的水平以跟上游泳池的平均需求。你會設置一個maxIdle來處理這些高峯時間,當你有流量爆發時。您應用的testWhileIdle = true配置將在清掃器出現時運行validationQuery,但默認情況下每次只運行3個連接。如果您想要測試更多,可以將numTestsPerEvictionRun配置爲更高的數字。這些「測試」確保您的連接仍處於良好狀態,以便在執行期間不會從池中獲取「壞」空閒連接。

我懷疑你可能更關心「掛起」連接而不是「空閒」連接。如果是這種情況,您將需要查看旨在銷燬運行時間超過X時間的「活動」連接的「廢棄」配置。 removeAbandonedOnMaintenance = true以及removeAbandonedTimeout = {numberOfSecondsBeforeEligibleForRemoval}。