apache连接池原理分析

如果需要知道为什么要用连接池,请百度

[img]http://dl2.iteye.com/upload/attachment/0098/7882/ff7a9807-34cf-3f73-bd63-afbeaf2adf15.png[/img]

PoolableObjectFactory 从名字上看这个类是 可池化的对象工厂,顾名思义是用来生成可池化的对象的,在连接池中一个对象在使用前或使用后 可能会有不同的状态,这个接口提供了标准的接口来使对象在不同的状态间切换,activateObject() passivateObject() 这两个方法就是来是对象切换不同状态,activateObject() 是使某个对象处于初始化后的状态,是在borrowObject里从池中获取到资源后调用的,是资源处于初始化后的状态。
passivateObject( ) 是使某个对象钝化,源码里是这样解释的
Uninitialize an instance to be returned to the idle object pool.意思就是在归还到池中前使对象还原成初始化前的状态。可见这个方法是在 returnObject()的时候调用的。


ObjectPool 用来管理池中对象的借出和归还以及池的初始化工作,虽然ObjectPool管理池中的对象,但对池中管理的对象的操作,是通过PoolableObjectFactory 对外提供的接口实现。达到连接池与池中管理的对象解耦的目的。

平常使用连接池的经常用到的配置是
minIdle:池初始化是默认生成多少个空闲的资源。
maxIdle:池中最大能存贮多少个空闲的资源,主要是用来限制returnObject()时,return的资源是否返还到连接池,如果池中空闲资源达到该上限,归还的资源会被desotry()掉
maxActive:激活的最大资源数。是指同时有多少个资源可以同时使用,是在borrowObject()时 起作用,如果maxActive已经达到上限,borrowObject()就不能立马获取到请求的资源。
maxWait:是请求获取不到资源时最大等待时间。这个参数是在maxActive已经达到上限时,如果有请求要获取资源,就会进入等待,在maxWait时间内允许获取到了其他线程释放的资源,如果maxWait时间内没获取到资源,就会抛异常(不同的场景,处理情况可能不一样)
还有一些高级配置
testOnBorrow: borrowObject()时验证资源是否可用 ,需要用到PoolableObjectFactory .validate()方法。
testOnReturn: returnObject()时 验证资源是否可用 需要用到PoolableObjectFactory .validate()方法。
testWhileIdle:定时检测连接池中的资源是否可用

从上面的连接池的配置上能看出来PoolableObjectFactory提供的功能和 连接池的需求是完全符合的。
ObjectPool与 PoolableObjectFactory 这两个接口 把连接池对资源的管理和资源本身的可以提供的操作,完全解耦,使ObjectPool更加容易扩展和重用。
ObjectPool 并不需要知道池中的对象具体是什么,只知道池中的对象提供了以下几种操作
1:makeObject();
2:activateObject();
3:passivateObject();
4:validateObject();
5:destroyObject();
这几个操作已经完全能够实现连接池实现自身的需求。
ObjectPool中最主要的就是 borrowObject();和returnObject();

你可能感兴趣的:(java,连接池,apache,common,pool)