概述
对象的生命周期:创建,使用,销毁。
对象池的作用,对象复用,避免创建新对象,节省资源,特别是对于数据库连接,网络连接这种耗时的操作。
常用的功能
- 对象包裹
- 对象的基本属性
- 是否被使用
- 对象管理
- 对象的初始化等基本操作
- 对象的销毁
- 对象存储的容器
- 维护对象的个数和生命周期
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 {
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复制}
}