正文
工作机制
对象池模式的工作原理是创建一个预初始化对象池,可以根据需要借用和归还这些对象。不是每次需要时都创建一个新对象,而是在池中搜索可以重用的可用对象。如果对象可用,则将其从池中移除并返回给请求对象,否则,将创建一个新对象并将其添加到池中。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
我这边通过使用
Apache Common Pool
来实现对象的池化技术。
1、引入依赖
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
<version>2.9.0version>
dependency>
2、需要池化的对象示例
public class Foo {
private final String username;
public Foo(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
}
3、构建对象创建工厂 可以直接实现
org.apache.commons.pool2.PooledObjectFactory
接口实现创建、销毁、钝化、取消等接口,也可以使用他的抽象类,实现创建和包装方法即可。
public class FooPoolObjectFactory extends BasePooledObjectFactory<Foo> {
@Override
public Foo create() throws Exception {
return new Foo(String.valueOf(RandomUtils.randomInt(0, 10)));
}
@Override
public PooledObject wrap(Foo obj) {
return new DefaultPooledObject<>(obj);
}
}
4、实现驱逐策略。我们有必要定期对对象的"健康状态"进行检查,剔除掉"不能用"的对象,并填充新的对象给"对象池"。一般数据库链接对象,要定期进行心跳,确保连接可用,如果连接断开,需要销毁对象,并重新创建新的对象。
common-pool
中,我们可以实现驱逐策略,对对象进行定期检查。关注公z号:码猿技术专栏,回复关键词:1111 获取阿里内部性能调优手册
public class FooEvictionPolicy implements EvictionPolicy<Foo> {
@Override
public boolean evict(EvictionConfig config, PooledObject underTest, int idleCount) {
// todo 定期检查对象某些功能是否可用
return true;
}
}
5、构建&配置对象池