对象的生命周期:创建,使用,销毁。
对象池的作用,对象复用,避免创建新对象,节省资源,特别是对于数据库连接,网络连接这种耗时的操作。
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> {
@Overridepublic DbConnect create() throws Exception { return new DbConnect();}@Overridepublic 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 删除。