1.定义自己的MyConnection
public class MyConnection {
private static Logger logger = LoggerFactory.getLogger(MyConnection.class);
private String name;
private boolean connected;
public MyConnection(String name) {
this.name = name;
}
public void connect() {
this.connected = true;
logger.info(name + ": " + true);
}
public void close() {
this.connected = false;
logger.info(name + ": " + false);
}
public boolean isConnected() {
return this.connected;
}
public String getName() {
return this.name;
}
public void print() {
logger.info(this.name);
}
}
2.定义工厂
public class MyConnectionFactory2 implements PooledObjectFactory<MyConnection> {
private static Logger logger = LoggerFactory.getLogger(MyConnectionFactory.class);
private static AtomicInteger count = new AtomicInteger(0);
public PooledObject<MyConnection> makeObject() throws Exception {
return new DefaultPooledObject<>(_makeObject());
}
@Override public void destroyObject(PooledObject<MyConnection> p) throws Exception {
destroyObject(p.getObject());
}
@Override public boolean validateObject(PooledObject<MyConnection> p) {
return validateObject(p.getObject());
}
@Override public void activateObject(PooledObject<MyConnection> p) throws Exception {
activateObject(p.getObject());
}
@Override public void passivateObject(PooledObject<MyConnection> p) throws Exception {
passivateObject(p.getObject());
}
private MyConnection _makeObject() throws Exception {
MyConnection myConn = new MyConnection(generateName());
logger.info(myConn.getName());
myConn.connect();
return myConn;
}
private void activateObject(MyConnection myConn) throws Exception {
logger.info(myConn.getName());
}
private void passivateObject(MyConnection myConn) throws Exception {
logger.info(myConn.getName());
}
private boolean validateObject(MyConnection myConn) {
logger.info(myConn.getName());
return myConn.isConnected();
}
private void destroyObject(MyConnection myConn) throws Exception {
logger.info(myConn.getName());
myConn.close();
}
private synchronized String generateName() {
return "conn_" + (count.incrementAndGet());
}
}
池化对象工程,这里的池化对象是MyConnection,这个工厂就是负责产生MyConnection对象的,产生的对象会放到池子中。
3.初始化对象池
public static GenericObjectPool<MyConnection> initPool(int max, int min) {
PooledObjectFactory<MyConnection> factory = new MyConnectionFactory2();
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setLifo(false);
config.setMaxTotal(max);
config.setMaxIdle(max);
config.setMinIdle(min);
config.setMaxWaitMillis(5 * 1000);// 取不到等待的超时间
config.setTimeBetweenEvictionRunsMillis(5 * 1000);
// 构造方法,会建立idle object,建立了两个
return new GenericObjectPool<>(factory, config);
}
4.对象池中对象数量控制
初始化对象池,后台Task {@link BaseGenericObjectPool.Evictor#run} 会调用{@link BaseGenericObjectPool#ensureMinIdle} 保证idleObjects保证{@link GenericObjectPool#idleObjects} 对象的size和{@link GenericObjectPool#getMinIdle}一致。
但是如果 {@link GenericObjectPool#createCount} == {@link GenericObjectPool#maxTotal}
{@link GenericObjectPool#create} 方法就无法继续创建对象了
{@link GenericObjectPool#borrowObject} 如果到了过期时间依然没有获取到
就会抛出异常 {@link java.util.NoSuchElementException} 异常