pool(二)——动手入门
生活随笔
收集整理的这篇文章主要介绍了
pool(二)——动手入门
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
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} 异常
总结
以上是生活随笔为你收集整理的pool(二)——动手入门的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: nginx 在线一键安装
- 下一篇: 《全面解读IPTV生态链》-转自CSDN