利用commons pool2开发之前先看他的一个最佳实践 -- JedisPool。
JedisPool是redis client的连接池,内部池对象的管理就是采用commons pool2。采用它的有很多优点是,例如:避免过多的创建连对象、自动处理最大空闲数量,避免自己处理线程问题等等。
JedisPool
只是做初始行为 设置ip host ssl等信息。
真正执行初始化 获取资源 归还资源的行为都是用pool来实现,pool内部含有GenericObjectPool ,GenericObjectPool就是管理池对象的最终类,它实现了ObjectPool接口,把borrowObject returnObject的方法都实现了.
JedisFactory
实现PooledObjectFactory ,GenericObjectPool 内部创建池对象就是通过这一个类,以及销毁池对象也是,具体的实现就端口client和关闭client连接。
JedisPoolConfig
定制专属的配置信息。
利用commons pool2 创建连接池大概就是这样,下来我们也可以通过commons pool2 创建自己的对象连接池
- 需要放进连接池的对象
-
对象生产工厂
连接池
- 测试
这是个最简单的案例 明白commons pool2的使用
原理
核心方法 borrowObject
默认 borrowMaxWaitMillis < 0 由于创建池对象到达最多数量时,就会执行到idleObjects.takeFirst() ,这个方法就会无限阻塞,一直等待有空闲的池对象。所有使用玩池对象的时候一定要归还。
create
returnObject
归还的时候简单 判断空闲数量是否大于最多空闲值,对齐进行销毁 或 放进空闲队列里;