利用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优化的六点方法
Mar 31 Servers
Nginx开启Brotli压缩算法实现过程详解
Mar 31 Servers
Nginx工作原理和优化总结。
Apr 02 Servers
windows下快速安装nginx并配置开机自启动的方法
May 11 Servers
Nginx+Tomcat负载均衡集群的实现示例
Oct 24 Servers
Z-Order加速Hudi大规模数据集方案分析
Mar 31 Servers
Vertica集成Apache Hudi重磅使用指南
Mar 31 Servers
iSCSI服务器CHAP双向认证配置
Apr 01 Servers
CentOS7安装GlusterFS集群以及相关配置
Apr 12 Servers
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
May 11 Servers
Python安装及建立虚拟环境的完整步骤
Jun 25 Servers
ubuntu端向日葵键盘输入卡顿问题及解决
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中的this,self和parent关键字详解教程
2007/03/19 PHP
使用PHP静态变量当缓存的方法
2013/11/13 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
php文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
Using the TextRange Object
2006/10/14 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
jquery 选择器部分整理
2009/10/28 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
JavaScript修改浏览器tab标题小技巧
2015/01/06 Javascript
jQuery实现ToolTip元素定位显示功能示例
2016/11/23 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
python实现simhash算法实例
2014/04/25 Python
Python合并多个装饰器小技巧
2015/04/28 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
企划专员岗位职责
2013/12/09 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
教师求职自荐信
2015/03/26 职场文书
上甘岭观后感
2015/06/10 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
详解MySQL中的pid与socket
2021/06/15 MySQL
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android