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