池化技术
池化技术是性能调优的重要措施,池化的思想是把对象放到池子里,当要使用的时候,从池子里面拿对象,用完后再放回池子里,这样可以降低资源分配以及释放的开销,从而提升性能,在实际项目中,其实我们每天都在使用池化技术。关于池化技术有以下几种:
- 对象池:通过复用对象,减少对象的创建、垃圾回收的开销
- 线程池:通过复用线程来提升性能
- 连接池:如数据库连接池/Redis连接池/HTTP连接池,通过复用TCP连接来减少创建和释放连接的时间来提升性能。
本文,我们详细来探讨一下对象池。
对象池
对象池用于维护一些很大、创建很慢的对象,提升性能。
对象池也有缺点,就是有一定的学习成本,并且增加代码的复杂度。
Commons-Pool2
Commons-Pool2是Apache基金会开源的对象池框架
官网地址
GitHub地址
Commons提供了两类对象池:
- ObjectPool
- KeyedObjectPool
ObjectPool
| 实现类 | 作用 |
|---|---|
| BaseObjectPool | 抽象类,用来扩展自己的对象池 |
| ErodingObjectPool | “腐蚀”对象池,代理一个对象池,并基于factor参数,为其添加“腐蚀”行为。归还的对象被腐蚀后,将会丢弃,而不是添加到空闲容量中。 |
| GenericObjectPool | 一个可配置的通用对象池实现。 |
| ProxiedObjectPool | 代理一个其他的对象池,并基于动态代理(支持JDK代理和CGLib代理),返回一个代理后的对象。该对象池主要用来增强对池化对象的控制,比如防止在归还该对象后,还继续使用该对象等。 |
| SoftReferenceObjectPool | 基于软引用的对象池 |
| SynchronizedObjectPool | 代理一个其他对象池,并为其提供线程安全的能力。 |
ObjectPool核心API
| 方法名 | 作用 |
|---|---|
| borrowObject | 从对象池中借对象 |
| returnObject() | 将对象归还到对象池 |
| invalidateObject() | 失效一个对象 |
| addObject() | 增加一个空闲对象,该方法适用于使用空闲对象预加载对象池 |
| clear() | 清空空闲的所有对象,并释放相关资源 |
| close() | 关闭对象池,并释放相关资源 |
| getNumIdle() | 获得空闲对象数量 |
| getNumActive() | 获得被借出对象数量 |
KeyedObjectPool
| 实现类 | 作用 |
|---|---|
| ErodingKeyedObjectPool | 作用 |
| GenericKeyedObjectPool | 类似GenericObjectPool |
| ProxiedKeyedObjectPool | 类似ProxiedObjectPool |
| SynchronizedKeyedObjectPool | 类似SynchronizedObjectPool |
它和ObjectPool的主要区别在于,它是通过Key去找对象的,从设计上来说KeyedObjectPool与ObjectPool没有区别。
快速入门
首先我们添加CommonsPools2的依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.11.1</version>
</dependency>
定义一个对象,并模拟对象创建慢的场景:
public class SlowObject {
public SlowObject(String name, Integer age) {
this.name = name;
this.age = age;
}
public static SlowObject init() {
//模拟对象创建慢的场景
try {
Thread.sleep(10L);
}catch (InterruptedException e) {
e.printStackTrace();
}
return new SlowObject("小飞龙",20);
}
private String name;
private Integer age;


2259

被折叠的 条评论
为什么被折叠?



