说明
这里实现一个简单的demo
之前介绍概念时,主要介绍了
pooledObject,pooledObjectFactory,objectPool
这里复用:
默认的objectPool即GenericObjectPool
pooledObject也复用默认的
自己写的是
pooledObject中被包装类
pooledObjectFactory
BigObj,用来模拟难以创建,但是可以复用的大对象
package pooling;
public class BigObj {
static int id = 0;
int v;
BigObj() {
this.v = id++;
System.out.println("create " + v);
}
public void destroy() {
System.out.println("destroy " + v);
}
public int getV() {
return v;
}
}
BigObjFactory,即pooledObjectFactory
这里注意,pooledObjectFactory#validateObject随机通过
package pooling;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import java.util.Random;
public class BigObjFactory implements PooledObjectFactory<BigObj> {
@Override
public PooledObject<BigObj> makeObject() throws Exception {
return new DefaultPooledObject<BigObj>(new BigObj());
}
@Override
public void destroyObject(PooledObject<BigObj> pooledObject)
throws Exception {
pooledObject.getObject().destroy();
}
@Override
public boolean validateObject(PooledObject<BigObj> pooledObject) {
//默认是false,代表验证不通过,这里随机好了
return new Random().nextInt()%2==0;
}
@Override
public void activateObject(PooledObject<BigObj> pooledObject)
throws Exception {
}
@Override
public void passivateObject(PooledObject<BigObj> pooledObject)
throws Exception {
}
}
Main进行测试
package pooling;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
public class Main {
public static void main(String[] args) throws Exception {
GenericObjectPoolConfig conf = new GenericObjectPoolConfig();
conf.setMaxTotal(5);
conf.setTestOnReturn(true);
GenericObjectPool<BigObj> pool = new GenericObjectPool<BigObj>(new BigObjFactory(), conf);
for(int i =0;i< 10; i++) {
BigObj bigObj = pool.borrowObject();
System.out.println(i + " time get " + bigObj.getV());
pool.returnObject(bigObj);
}
}
}
结果
create 0
0 time get 0
destroy 0
create 1
1 time get 1
2 time get 1 //第1次 归还1的时候验证通过,继续服用
destroy 1 //第2次 归还1的时候验证不通过,destroy掉
create 2
3 time get 2
destroy 2
create 3
4 time get 3
destroy 3
create 4
5 time get 4
destroy 4
create 5
6 time get 5
7 time get 5
destroy 5
create 6
8 time get 6
destroy 6
create 7
9 time get 7
destroy 7
思考
1.代码主要管理需要被包装的,需要池复用的类
2.poolObject以及objectPool需要根据需要自己复现,一般情况下复用默认的即可