java連線池的maxIdle該如何配置

2021-07-24 12:52:02 字數 2980 閱讀 6889

摘要

:最近針對某系統做了次壓力測試,在併發較高的時候暴露了乙個

maxidle

設定不合理的問題,特總結一下這次問題,並分析一下這個問題背後的原因。

問題現象 用

60個執行緒併發訪問某個讀和寫均有的業務介面,效能測試人員檢視

oracle

資料庫負載

cpu非常高,而且

oracle

的logons

指標達到

148.1次/

秒(這個值的含義是資料庫客戶端登入認證的每秒的次數)。

而且檢視應用程式中的執行緒棧,也發現了較多數量的執行緒處於建立新的

oracle

物理連線處。

這當時就讓我有點兒糊塗了,我們不是用了連線池嗎?怎麼還會經常建立物理連線呢?

問題分析解決

遇到這個問題,我當時也是從自己掌握的各種知識裡去想可能的原因,都想到了是不是因為

tcp連線的超時時間是不是太短,仔細一想這些可能性都排除掉了。然後檢視連線池的配置,當時我們的同學告訴我這些配置跟線上的是一樣的,應該沒有問題,我當時是就懷疑是

maxidle

設定太小導致的原因,但是沒有什麼具體的依據。

所以我就簡單開發了乙個頁面可以實時檢視當時應用連線池的

active number

(當前被使用的資料庫連線數)和

idle number

(當前處於空閒狀態的資料庫連線數)。再次執行測試指令碼,通過檢視連線池的連線數就可以看出來,連線數的波動較大,有時候連線總數(上面兩個數字相加)從

20多突然降到

10,說明物理連線被銷毀了,建立了新的物理連線,那這就與我們看到的一些異常現象相吻合了,建立新的連線就會導致

oracle

資料庫伺服器的

logons

數量增加。由於連線的復用率較差,導致頻繁的建立物理連線,

oracle

資料庫的資源消耗增大。

網上找到一篇文章詳細介紹

dbcp

連線池配置的,它關於

maxidle

的配置說明是這麼寫的。

maxidle值與maxactive值應配置的接近。 因為,當連線數超過maxidle值後,剛剛使用完的連線(剛剛空閒下來)會立即被銷毀。而不是我想要的空閒m秒後再銷毀起乙個緩衝作用。這一點dbcp做的可能與你想像的不一樣。 若maxidle與maxactive相差較大,在高負載的系統中會導致頻繁的建立、銷毀連線,連線數在maxidle與maxactive間快速頻繁波動,這不是我想要的。 高負載系統的maxidle值可以設定為與maxactive相同或設定為-1(-1表示不限制),讓連線數量在minidle與maxidle間緩衝慢速波動。

原文參考:

看到這個我明白了因為我們的配置是

maxidle

配置的值是5,而

maxactive

配置的值為

40,這樣當併發較高的時候,當連線數接近

maxactive

值的情況下,空閒連線數很容易超過

maxidle

,很快就被連線池給主動銷毀了,這樣就導致了連線頻繁的建立,弱化了資料庫連線池的作用。

這次的效能測試然讓我深刻的感受到了資料庫連線池對的價值,使用得當,它能夠很好地復用已有的物理連線,在高併發的場景下,減少頻繁的建立和銷毀物理連線,降低系統的壓力。用得不好,它的價值就發揮不出來,就像咱們今天這個案例一樣。

為什麼是這樣的?

maxidle

的值為什麼要與

maxactive

的接近呢?果真如此嗎?我們還要通過原始碼來分析它背後的根本原因。

看看上圖是對

dbcp

連線池的獲取和歸還連線物件的流程圖的描述,通過該圖我們就一目了然了。

詳細的原理和原始碼分析請看這裡:

maxidle

配置總結

maxidle

值與maxactive

值應配置的接近。

因為,當連線數超過

maxidle

值後,剛剛使用完的連線(剛剛空閒下來)會立即被銷毀。而不是我想要的空閒

m秒後再銷毀起乙個緩衝作用。這一點

dbcp

做的可能與你想像的不一樣。 若

maxidle

與maxactive

相差較大,在高負載的系統中會導致頻繁的建立、銷毀連線,連線數在

maxidle

與maxactive

間快速頻繁波動,這不是我們想要的。

高負載系統的

maxidle

值可以設定為與

maxactive

相同或設定為

-1(-1

表示不限制

),讓連線數量在

minidle

與maxidle

間緩衝慢速波動。

多餘的空閒連線等待**執行緒來緩慢**。

1.如果是連線池命中率(即應用在獲取連線時直接獲得已經建立物理連線的比率)優先的應用。適合連線資源較充裕的環境,可以盡可能將

maxidle

設定得更大一些,多數應用設定的大一些會更加安全。 2.

如果是連線資源利用率(即被使用連線佔的比率)優先的應用。適合那些連線資源緊張的環境。可以盡可能將

maxidle

設定得更小一些,這樣空閒連線能夠得到更快的釋放,保持乙個較小的連線,但是設定的過小的話會導致連線池命中率非常低,弱化連線池的作用。

Java實現連線池

連線池原理,非常透徹 public class connectionpool catch exception e try catch exception e static catch filenotfoundexception e catch ioexception e 建立乙個資料庫連線池,連線池...

連線池與使用Tomcat的連線池

what is connection pool?看圖 1 存放connection物件的容器 2 減少連線資料庫的開銷 3 程式請求連線時,在connection pool中取連線 4 連線使用完後,放回connection pool,不釋放 5 connection pool對連線進行管理 計數 ...

mysql連線池的概念 連線池概念

1 連線池是乙個程序 多個連線是在乙個程序裡面儲存 管理的。這個程序儲存所有的連線,當我們開啟連線,如果有未用連線可用,則返回該連線。如果池中的連線都用完了,則建立乙個新的連線儲存到連線池。而但我們關閉連線的時候,連線池裡面並不關閉連線,而是返回連線池中並標記為可重用的狀態,等待重新連線直到等待超時...