在本身使用 Apache Common-pool2 寫鏈接池的時候,一下幾個參數須要特別注意的: java
maxTotal : 默認值:8 併發
運行建立的最大的鏈接個數 spa
minIdle : 默認值:0 線程
最小保持的鏈接個數
it
maxIdle :默認值:8 io
最大的空閒個數
table
maxWaitMillis : 默認值:-1 配置
獲取鏈接的最大的等待時間
object
minEvictableIdleTimeMillis : 默認值:1000L * 60L * 30L (30分鐘) 線程池
鏈接空閒多久之後之後須要被回收。 ()
timeBetweenEvictionRunsMillis : 默認值: -1
鏈接池的 回收線程的檢查時間 。 若是小於 0 ,則不會檢查。
numTestsPerEvictionRun : 默認值 3 。
每次檢查回收的線程的個數。
——————————————————————————————————————————————
上面是對經常使用的一些參數的說明,下面就 鏈接池的建立過程和銷燬過程進行說明:
線程池增長的過程以下:
若是不停的建立鏈接,首先檢查鏈接池裏面是否有鏈接能夠用,若是沒有,檢查 已經建立的鏈接的個數是否超過了maxTotal ,若是超過,等待maxWaitMillis 毫秒,看有沒有鏈接釋放,若是有,獲取到鏈接,若是沒有,直接返回 : java.util.NoSuchElementException: Timeout waiting for idle object 異常信息。
若是沒有超過maxTotal , 則建立一個鏈接出來。 用完這個鏈接,返回給線程池的時候,檢查當前線程池的 大小是否是超過了 maxIdle , 若是超過了,直接 銷燬掉這個鏈接,若是沒有,返回給線程池。
線程池減小的過程:
若是你沒有配置 timeBetweenEvictionRunsMillis , 則鏈接池中保存的鏈接的最小的大小爲 minIdle , 最大的值爲 maxIdle , maxIdle - minIdle 之間的數據是不會被主動回收的。
這裏就有個問題,若是你的系統的併發上去了。線程池的大小 增長到 maxIdle , 等系統的請求降下來之後,線程池的大小並無恢復到 minIdle 的大小。
若是配置了 timeBetweenEvictionRunsMillis , 就會啓動一個線程, 每隔 這個時間就會去檢查 , 若是若是超過了 minEvictableIdleTimeMillis 這個時間沒有使用 , 或者 大於了 maxIdle , 會進行回收, 回收的線程的個數 默認是 3 個 。 若是回收完了 , 再去檢查 線程池的 大小是否是 小於 minIdle , 若是小於 , 則建立 對應 少的 線程 , 而後添加到 對應的線程池 中 。