当前位置: 首页>后端>正文

对象池案例一

对象池案例一,第1张

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-pool2</artifactId>

<version>2.11.1</version>

</dependency>

在Java应用程序中,频繁地创建和销毁对象会消耗大量的内存和CPU资源,影响应用程序的性能和可伸缩性。为了解决这个问题,我们可以使用对象池技术,将对象存储在池中,在需要的时候从池中获取,使用完毕后将对象归还到池中。Apache Commons Pool2是一个流行的开源对象池实现,提供了丰富的功能和配置选项,可以满足不同应用程序的需求。

Commons Pool2是一个流行的开源对象池实现,提供了丰富的接口和配置选项,使得实现对象池变得非常容易,并且可以根据具体的业务需求进行灵活的配置。Commons Pool2还支持多线程共享对象池中的对象,避免线程之间的竞争,从而提高应用程序的并发性能。

链接池/对象池(ObjectPool):用于存放链接对象的一个池子(集合),通常用数组或者List对象.durid用两个数组分别保存活跃的链接和空闲链接.commons-pool2用双端阻塞队列LinkedBlockingDeque保存空闲链接

用ConcurrentHashMap保存所有的链接.

对象工厂(PooledObjectFactory):连接池工厂,用于产生一个新的链接对象.

链接对象/池中对象(PooledObject):链接池里面存放的对象.

// 自定义的资源类

public class MyObject {

LocalTime time;

public String id;

int seq = 0;

public MyObject(String id){

this.id = id;

time = LocalTime.now();

}

public void cry(){

System.out.println(time + "cry "+ seq++);

this.hashCode();

}

public boolean isOk(){

return this.seq ?< 2;

}

}

// 自定义的资源对象的 key,用于区分资源类

public class MyKey {

public String key ;

public MyKey(String key){

this.key = key;

}

@Override

public int hashCode(){

return (this.key).hashCode();

}

}

public class MyObjectPool {

@Getter

private final GenericKeyedObjectPool<MyKey,MyObject> pool;

public MyObjectPool() {

GenericKeyedObjectPoolConfig<MyObject> config = new GenericKeyedObjectPoolConfig<>();

// 最大资源数

config.setMaxTotal(1);

// 每个 key 对应的最大资源数

config.setMaxTotalPerKey(1);

// 最大 key 数量

config.setMaxIdlePerKey(1);

// 没有可用资源时是否要等待

config.setBlockWhenExhausted(true);

// 创建新资源对象后是否立即校验是否可用

config.setTestOnCreate(false);

// 借用资源对象前是否校验是否可用

config.setTestOnBorrow(true);

KeyedPooledObjectFactory<MyKey , MyObject> factory = new MyPooledObjectFactory();

this.pool = new GenericKeyedObjectPool<>(factory, config);

}

}

// 自定义 Factory 类,实现了 apache 的接口,用于管理资源类

public class MyPooledObjectFactory implements KeyedPooledObjectFactory<MyKey ,MyObject> {

@Override

public void activateObject(MyKey s, PooledObject<MyObject> pooledObject) throws Exception {

System.out.println("激活对象,借用时调用");

}

@Override

public void destroyObject(MyKey s, PooledObject<MyObject> pooledObject) throws Exception {

System.out.println("销毁对象");

}

@Override

public PooledObject<MyObject> makeObject(MyKey s) throws Exception {

System.out.println("创建对象");

MyObject object = new MyObject(s.key);

return new DefaultPooledObject(object);

}

// “钝化:就是序列化,把对象转化为字节序列,把Session对象从内存保存到硬盘里。

// 活化:就是反序列化,把字节序列转化为对象,把Session对象从硬盘再读回内存。

@Override

public void passivateObject(MyKey s, PooledObject<MyObject> pooledObject) throws Exception {

System.out.println("钝化对象,归还时调用");

}

@Override

public boolean validateObject(MyKey s, PooledObject<MyObject> pooledObject) {

System.out.println("判断对象是否可用");

return pooledObject.getObject().isOk();

}

}

public class MyTest {

public static void main(String[] args) throws Exception {

MyObjectPool myObjectPool = new MyObjectPool();

GenericKeyedObjectPool<MyKey , MyObject> pool ?= myObjectPool.getPool();

MyKey key = new MyKey("1");

for(int i=0;i<3;i++){

MyObject myObject = pool.borrowObject(key);

myObject.cry();

pool.returnObject(key,myObject);

System.out.println(" ???");

}

}

}


https://www.xamrdz.com/backend/37d1939445.html

相关文章: