利用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 反向代理之 proxy_pass的实现
Mar 31 Servers
Nginx配置80端口访问8080及项目名地址方法解析
Mar 31 Servers
nginx请求限制配置方法
Jul 09 Servers
nginx刷新页面出现404解决方案(亲测有效)
Mar 18 Servers
Consul在linux环境的集群部署
Apr 08 Servers
Docker下安装Oracle19c
Apr 13 Servers
Docker 镜像介绍以及commit相关操作
Apr 13 Servers
IIS服务器中设置HTTP重定向访问HTTPS
Apr 29 Servers
腾讯云服务器部署前后分离项目之前端部署
Jun 28 Servers
码云(gitee)通过git自动同步到阿里云服务器
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
php5.3提示Function ereg() is deprecated Error问题解决方法
2014/11/12 PHP
利用“多说”制作留言板、评论系统
2015/07/14 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
php格式文件打开的四种方法
2018/02/24 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
Javascript客户端脚本的设计和应用
2006/08/21 Javascript
htm调用JS代码
2007/03/15 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
jQuery常用选择器详解
2017/07/17 jQuery
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
Vue 组件复用多次自定义参数操作
2020/07/27 Javascript
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
Python基于动态规划算法计算单词距离
2015/07/25 Python
python web框架学习笔记
2016/05/03 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
送给他或她的礼物:FUN.com
2018/08/17 全球购物
比较基础的php面试题及答案-编程题
2012/10/14 面试题
家长给小学生的评语
2014/01/30 职场文书
老师对学生的评语
2014/04/18 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书