对象的生命周期:创建,使用,销毁。
对象池的作用,对象复用,避免创建新对象,节省资源,特别是对于数据库连接,网络连接这种耗时的操作。
commons-pool2的使用
幸运的是在java里面,已经有很好的库可以直接使用commons-pool2
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2.version}</version>
</dependency>
资源对象
@ToString
@Data
public class DbConnect {
private Integer id;
private String info;
}
资源对象工厂
public class DbConnectFactory extends BasePooledObjectFactory<DbConnect> {
@Override
public DbConnect create() throws Exception {
return new DbConnect();
}
@Override
public PooledObject<DbConnect> wrap(DbConnect obj) {
return new DefaultPooledObject<DbConnect>(obj);
}
}
使用
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;
/**
public static void main(String[] args) throws Exception{
PooledObjectFactory<DbConnect> factory = new DbConnectFactory();
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxIdle(5);
poolConfig.setMinIdle(1);
poolConfig.setMaxTotal(20);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(false);
poolConfig.setTestWhileIdle(false);
poolConfig.setLifo(true);
poolConfig.setBlockWhenExhausted(true);
poolConfig.setNumTestsPerEvictionRun(3);
final GenericObjectPool<DbConnect> pool = new GenericObjectPool<DbConnect>(factory, poolConfig);
for (int j=1;j < 10 ;j ++) {
new Thread(() ->{
for (int i =0; i < 100; i++) {
try {
DbConnect dbConnect = pool.borrowObject();
if (null == dbConnect.getId()) {
dbConnect.setId(i);
dbConnect.setInfo("id:"+i);
}
System.out.println(dbConnect);
}catch (Exception e) {
log.error("connect error", e);
}
}
}).start();
}
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。