在本身使用 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 , 若是小于 , 则建立 对应 少的 线程 , 而后添加到 对应的线程池 中 。