利用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启动失败的几种错误处理
Apr 01 Servers
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
Jul 07 Servers
关于nginx 实现jira反向代理的问题
Sep 25 Servers
解决使用了nginx获取IP地址都是127.0.0.1 的问题
Sep 25 Servers
Window server 2012 R2 AD域的组策略相关设置
Apr 28 Servers
Windows Server 2019 域控制器安装图文教程
Apr 28 Servers
Nginx开源可视化配置工具NginxConfig使用教程
Jun 21 Servers
Linux下搭建SFTP服务器的命令详解
Jun 25 Servers
Linux安装Docker详细教程
Jul 07 Servers
Nginx如何获取自定义请求header头和URL参数详解
Jul 23 Servers
Centos7 Shell编程之正则表达式、文本处理工具详解
Aug 05 Servers
Flink 侧流输出源码示例解析
Sep 23 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脚本不报错的原因
2014/06/12 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
PHP之header函数详解
2021/03/02 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
python批量提交沙箱问题实例
2014/10/08 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
深入理解Django中内置的用户认证
2017/10/06 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
python绘制热力图heatmap
2020/03/23 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
Python try except finally资源回收的实现
2021/01/25 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
单位人事专员介绍信
2014/01/11 职场文书
教师开学感言
2014/02/14 职场文书
庆六一开幕词
2015/01/29 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python
Python&Matlab实现樱花的绘制
2022/04/07 Python
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL