利用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简单配置多个server的方法
Mar 31 Servers
Nginx + consul + upsync 完成动态负载均衡的方法详解
Mar 31 Servers
win10安装配置nginx的过程
Mar 31 Servers
详解Nginx启动失败的几种错误处理
Apr 01 Servers
Minikube搭建Kubernetes集群
Mar 31 Servers
OpenStack虚拟机快照和增量备份实现方法
Apr 04 Servers
Tomcat弱口令复现及利用
May 06 Servers
使用Nginx+Tomcat实现负载均衡的全过程
May 30 Servers
nginx静态资源的服务器配置方法
Jul 07 Servers
搭建zabbix监控以及邮件报警的超级详细教学
Jul 15 Servers
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
Jul 15 Servers
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
Jul 15 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 echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
js date 格式化
2017/02/15 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
Python collections模块实例讲解
2014/04/07 Python
python threading模块操作多线程介绍
2015/04/08 Python
Python判断Abundant Number的方法
2015/06/15 Python
Python深度优先算法生成迷宫
2018/01/22 Python
Python闭包函数定义与用法分析
2018/07/20 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
python+opencv3生成一个自定义纯色图教程
2020/02/19 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
如何用python处理excel表格
2020/06/09 Python
用python批量移动文件
2021/01/14 Python
HTML5中的网络存储实现方式
2020/04/28 HTML / CSS
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
大学生四年生活自我鉴定
2013/11/21 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
财务负责人任命书
2014/06/06 职场文书
英文慰问信范文
2015/03/24 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
如何解决php-fpm启动不了问题
2021/11/17 PHP
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang