1、资源池
对于共享资源,有一个很著名的设计模式:资源池。该模式正是为了解决资源频繁分配、释放所造成的问题的。把该模式应用到数据库连接管理领域,就是建立一个数据库连接池,提供一套高效的连接分配、使用策略,最终目标是实现连接的高效、安全的复用。还有一类对象池大家可能不太了解,对于nio中有个堆外内存,netty的ByteBuf对象的实现就是一个可复用的对象池来提高性能。连接池大家平时听的多,使用也多,但是自己实现应该比较少。
1.1 LinkedBlockingQueue应用实例
并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。
一个简单的资源池可以使用LinkedBlockingQueue实现,需要的对象如下:
ICommonPool : 定义通用池,借出对象和归还对象
PoolFactory :对象工厂,负责创建和销毁对象
PoolConfig : 对象池的配置(最大连接数和最小连接数)
BaseCommonPool :对象池的主要基础实现
1.2 commons-pool2实现资源池
PooledObject(池化对象) PooledObjectFactory(对象工厂) ObjectPool (对象池)
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.2</version>
</dependency>
使用
@Autowired
private TestObjectPool testObjectPool;
public void test() {
TestObject testObject = null;
try {
testObject = testObjectPool.borrowObject();
//省略业务代码...
} catch (Exception e) {
e.printStackTrace();
} finally {
if (testObject != null) {
//最终归还对象到对象池
testObjectPool.returnObject(testObject);
}
}
}
注意:使用对象要,需要returnObject,为了方便管理,可以参考数据库连接池的service层的设计,当service抛出异常时,捕获异常,释放对象。
参考:
java对象池化技术
springboot使用commons-pool2实现对象池
commons-pools详细参数配置