利用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 相关文章推荐
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
Mar 09 Servers
Nginx的反向代理实例详解
Mar 31 Servers
使用Nginx搭载rtmp直播服务器的方法
Oct 16 Servers
使用Docker容器部署rocketmq单机的全过程
Apr 03 Servers
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
Apr 29 Servers
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
May 11 Servers
windows server 2012安装FTP并配置被动模式指定开放端口
Jun 10 Servers
Windows Server 2022 超融合部署(图文教程)
Jun 25 Servers
windows server 2016 域环境搭建的方法步骤(图文)
Jun 25 Servers
git中cherry-pick命令的使用教程
Jun 25 Servers
本地搭建minio文件服务器(使用bat脚本启动)的方法
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
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
PHP array_multisort()函数的使用札记
2011/07/03 PHP
使用php清除bom示例
2014/03/03 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
PHP中$this和$that指针使用实例
2015/01/06 PHP
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
js实现简单的秒表
2020/01/16 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
利用Python演示数型数据结构的教程
2015/04/03 Python
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
专科文秘应届生求职信
2013/11/18 职场文书
投资协议书范本
2014/04/21 职场文书
竞聘演讲稿
2014/04/24 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
工作服管理制度范本
2015/08/06 职场文书
课题研究阶段性总结
2015/08/13 职场文书
python垃圾回收机制原理分析
2022/04/13 Python
Java异常体系非正常停止和分类
2022/06/14 Java/Android