每天20分钟对象池的使用

2023-05-29 22:20:24 浏览数 (1)

概述

对象的生命周期:创建,使用,销毁。

对象池的作用,对象复用,避免创建新对象,节省资源,特别是对于数据库连接,网络连接这种耗时的操作。

常用的功能

  • 对象包裹
    • 对象的基本属性
    • 是否被使用
  • 对象管理
    • 对象的初始化等基本操作
    • 对象的销毁
    • 对象存储的容器
    • 维护对象的个数和生命周期

commons-pool2的使用

幸运的是在java里面,已经有很好的库可以直接使用commons-pool2

<dependency>

代码语言:txt复制
<groupId>org.apache.commons</groupId>
代码语言:txt复制
<artifactId>commons-pool2</artifactId>
代码语言:txt复制
<version>${commons-pool2.version}</version>

</dependency>

资源对象

@ToString

@Data

public class DbConnect {

代码语言:txt复制
private Integer id;
代码语言:txt复制
private String info;

}

资源对象工厂

public class DbConnectFactory extends BasePooledObjectFactory<DbConnect> {

代码语言:txt复制
@Override
代码语言:txt复制
public DbConnect create() throws Exception {
代码语言:txt复制
    return new DbConnect();
代码语言:txt复制
}
代码语言:txt复制
@Override
代码语言:txt复制
public PooledObject<DbConnect> wrap(DbConnect obj) {
代码语言:txt复制
    return new DefaultPooledObject<DbConnect>(obj);
代码语言:txt复制
}

}

使用

package cn.beckbi.ex.objectpool;

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.pool2.PooledObjectFactory;

import org.apache.commons.pool2.impl.GenericObjectPool;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

/**

  • @program: wj
  • @description:
  • @author: bikang
  • @create: 2023-05-28 20:31 */ @Slf4j public class ObjectPoolX {
代码语言:txt复制
public static void main(String[] args) throws Exception{
代码语言:txt复制
    PooledObjectFactory<DbConnect> factory = new DbConnectFactory();
代码语言:txt复制
    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
代码语言:txt复制
    poolConfig.setMaxIdle(5);
代码语言:txt复制
    poolConfig.setMinIdle(1);
代码语言:txt复制
    poolConfig.setMaxTotal(20);
代码语言:txt复制
    poolConfig.setTestOnBorrow(true);
代码语言:txt复制
    poolConfig.setTestOnReturn(false);
代码语言:txt复制
    poolConfig.setTestWhileIdle(false);
代码语言:txt复制
    poolConfig.setLifo(true);
代码语言:txt复制
    poolConfig.setBlockWhenExhausted(true);
代码语言:txt复制
    poolConfig.setNumTestsPerEvictionRun(3);
代码语言:txt复制
    final GenericObjectPool<DbConnect> pool = new GenericObjectPool<DbConnect>(factory, poolConfig);
代码语言:txt复制
    for (int j=1;j < 10 ;j   ) {
代码语言:txt复制
        new Thread(() ->{
代码语言:txt复制
            for (int i =0; i < 100; i  ) {
代码语言:txt复制
                try {
代码语言:txt复制
                    DbConnect dbConnect = pool.borrowObject();
代码语言:txt复制
                    if (null == dbConnect.getId()) {
代码语言:txt复制
                        dbConnect.setId(i);
代码语言:txt复制
                        dbConnect.setInfo("id:" i);
代码语言:txt复制
                    }
代码语言:txt复制
                    System.out.println(dbConnect);
代码语言:txt复制
                }catch (Exception e) {
代码语言:txt复制
                    log.error("connect error", e);
代码语言:txt复制
                }
代码语言:txt复制
            }
代码语言:txt复制
        }).start();
代码语言:txt复制
    }
代码语言:txt复制
}

}

0 人点赞