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} 异常
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值