利用Apache Common将java对象池化的问题


Posted in Servers onJune 16, 2022

什么是对象池化?

对象被创建后,使用完毕不是立即销毁回收对象,而是将对象放到一个容器保存起来,下次使用的时候不用创建对象,而是从容器中直接获取。

什么样的对象需要池化?

一般需要池化的对象往往都是比"重量级"较的对象,创建和销毁都比较耗时,比如我们的"线程","数据库链接对象","tcp链接对象", "FTP链接对象" 等等。

对象池化的好处?

这些对象池化后,之后使用的时候不用创建,直接使用即可,可以大大缩短程序的运行时间,以及创建对象时对CPU资源的消耗,以及对系统资源的控制(池化的对象数量有限,不会一直创建对象,导致系统资源耗尽,或者造成程序OOM的情况)进而提高系统的稳定性。

对象池化后需要注意什么?

这些被池化的对象都有一个特点,都是"活的",比如数据库链接对象内部一般保存了一个TCP链接,所以,这个对象"能用"的前提是这个TCP链接是有效的,线程对象"能用"的前提是线程的状态不是"凋亡"状态,所以我们有必要定期对对象的"健康状态"进行检查,剔除掉"不能用"的对象,并填充新的对象给"对象池"。

使用apache-common-pool池化对象

  • 引入依赖
<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.9.0</version>
        </dependency>
  • 需要池化的对象示例
public class Foo {
    private final String username;
    public Foo(String username) {
        this.username = username;
    }
    public String getUsername() {
        return username;
    }
}
  • 构建对象创建工厂

可以直接实现org.apache.commons.pool2.PooledObjectFactory<T>接口实现创建、销毁、钝化、取消等接口,也可以使用他的抽象类,实现创建和包装方法即可。

public class FooPoolObjectFactory extends BasePooledObjectFactory<Foo> {
    @Override
    public Foo create() throws Exception {
        return new Foo(String.valueOf(RandomUtils.randomInt(0, 10)));
    }
    @Override
    public PooledObject<Foo> wrap(Foo obj) {
        return new DefaultPooledObject<>(obj);
    }
}
  • 实现驱逐策略

一般数据库链接对象,要定期进行心跳,确保链接可用,如果链接断开,需要销毁对象,并重新创建新的对象。common-pool中,我们可以实现驱逐策略,对对象进行定期检查

public class FooEvictionPolicy implements EvictionPolicy<Foo> {
    @Override
    public boolean evict(EvictionConfig config, PooledObject<Foo> underTest, int idleCount) {
        // todo  定期检查对象某些功能是否可用
        return true;
    }
}
  • 构建&配置对象池
public GenericObjectPool<Foo> fooGenericObjectPool() {
        GenericObjectPoolConfig<Foo> poolConfig = new GenericObjectPoolConfig<>();
        poolConfig.setEvictionPolicy(new FooEvictionPolicy());
        poolConfig.setBlockWhenExhausted(true);
        poolConfig.setJmxEnabled(false);
        poolConfig.setMaxWaitMillis(1000 * 10);
        poolConfig.setTimeBetweenEvictionRunsMillis(60 * 1000);
        poolConfig.setMinEvictableIdleTimeMillis(20 * 1000);
        poolConfig.setTestWhileIdle(true);
        poolConfig.setTestOnReturn(true);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setMaxTotal(3);
        // 设置抛弃策略
        AbandonedConfig abandonedConfig = new AbandonedConfig();
        abandonedConfig.setRemoveAbandonedOnMaintenance(true);
        abandonedConfig.setRemoveAbandonedOnBorrow(true);
        return new GenericObjectPool<>(new FooPoolObjectFactory(), poolConfig, abandonedConfig);
    }

如果我们使用的是spring容器,一般我们需要将该对象交由spring管理。

  • 获取&归还对象
private final GenericObjectPool<Foo> fooGenericObjectPool = fooGenericObjectPool();
    public Foo borrowFoo () throws Exception {
        return fooGenericObjectPool.borrowObject();
    }
    public void returnObject(Foo foo){
        fooGenericObjectPool.returnObject(foo);
    }

到此这篇关于利用Apache Common将java对象“池化”的文章就介绍到这了,更多相关Apache Common java对象池化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Servers 相关文章推荐
Nginx实现反向代理
Sep 20 Servers
Nginx代理同域名前后端分离项目的完整步骤
Mar 31 Servers
详解Nginx 工作原理
Mar 31 Servers
Nginx配置文件详解以及优化建议指南
Sep 15 Servers
解决xampp安装后Apache无法启动
Mar 21 Servers
Z-Order加速Hudi大规模数据集方案分析
Mar 31 Servers
永中文档在线转换预览基于nginx配置部署方案
Jun 10 Servers
WinServer2012搭建DNS服务器的方法步骤
Jun 10 Servers
在虚拟机中安装windows server 2008的图文教程
Jun 28 Servers
nginx之内存池的实现
Jun 28 Servers
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
Aug 14 Servers
ubuntu如何搭建vsftpd服务器
Dec 24 Servers
Tomcat 与 maven 的安装与使用教程
V Rising 服务器搭建图文教程
安装harbor作为docker镜像仓库的问题
openEuler 搭建java开发环境的详细过程
Jun 10 #Servers
WinServer2012搭建DNS服务器的方法步骤
Jun 10 #Servers
windows server 2012安装FTP并配置被动模式指定开放端口
Jun 10 #Servers
Win Server2016远程桌面如何允许多用户同时登录
Jun 10 #Servers
You might like
PHP实现的DES加密解密实例代码
2016/04/06 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
jQuery实现的手风琴侧边菜单效果
2017/03/29 jQuery
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
Vue.js的动态组件模板的实现
2018/11/26 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
在小程序中推送模板消息的实现方法
2019/07/22 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
Python中zfill()方法的使用教程
2015/05/20 Python
django实现用户登陆功能详解
2017/12/11 Python
Flask之请求钩子的实现
2018/12/23 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
Python修改列表值问题解决方案
2020/03/06 Python
python em算法的实现
2020/10/03 Python
国际象棋商店:The Chess Store
2018/07/09 全球购物
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
delegate与普通函数的区别
2014/01/22 面试题
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
评析教师个人的自我评价
2014/02/19 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
加薪申请报告范本
2015/05/15 职场文书
团队执行力培训心得体会
2015/08/15 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers