springboot使用commons-pool2实现对象池

一. 连接池概述

频繁的创建和销毁,会极大的降低系统的性能,而对象池会在初始化的时候会创建一定数量的对象,每次访问只需从对象池中获取对象,使用完毕后再放回对象池,并不是直接销毁,这样可以保证程序重复使用同一个对象而不需要每次访问都创建和销毁对象, 从而提高系统性能。

二. commons-pool2介绍

加入pool2依赖:


<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.2</version>
</dependency>


pool2的组成

​PooledObject(池化对象) PooledObjectFactory(对象工厂) ObjectPool (对象池)​

需要池化的对象


/**
* 需要池化的对象
*
* @author lz
* @date 2019/7/30
*/
public class TestObject {
private String name;
private boolean isActive;

public TestObject() {
}

public TestObject(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public boolean isActive() {
return isActive;
}

public void setActive(boolean active) {
isActive = active;
}

public void destroy(){

}
}



TestObject 工厂

在commons-pool2中有两种工厂:PooledObjectFactory 和KeyedPooledObjectFactory,我们使用前者。


public interface PooledObjectFactory<T> {
//创建对象
PooledObject<T> makeObject();
//激活对象
void activateObject(PooledObject<T> obj);
//钝化对象
void passivateObject(PooledObject<T> obj);
//验证对象
boolean validateObject(PooledObject<T> obj);
//销毁对象
void destroyObject(PooledObject<T> obj);
}


创建TestObjectFactory只需要继承BasePooledObjectFactory这个抽象类 ,而它则实现了PooledObjectFactory,也可以直接实现PooledObjectFactory接口;我们使用实现PooledObjectFactory接口:


import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;

/**
* TestObject 工厂类
*
* @author lz
* @date 2019/7/30
*/
public class TestObjectFactory implements PooledObjectFactory<TestObject> {
/**
* /构造一个封装对象
*
* @return
* @throws Exception
*/
@Override
public PooledObject<TestObject> makeObject() throws Exception {
return new DefaultPooledObject<>(new TestObject());
}
/**
* 销毁对象
*
* @param p
* @throws Exception
*/
@Override
public void destroyObject(PooledObject<TestObject> p) throws Exception {
p.getObject().destroy();
}
/**
* 验证对象是否可用
*
* @param p
* @return
*/
@Override
public boolean validateObject(PooledObject<TestObject> p) {
return p.getObject().isActive();
}
/**
* 激活一个对象,使其可用用
*
* @param p
* @throws Exception
*/
@Override
public void activateObject(PooledObject<TestObject> p) throws Exception {
p