欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

pool(二)——动手入门

发布时间:2024/3/13 编程问答 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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(二)——动手入门的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。