利用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 02 Servers
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
Apr 04 Servers
apache基于端口创建虚拟主机的示例
Apr 22 Servers
centos8安装nginx1.9.1的详细过程
Aug 02 Servers
Nginx中使用Lua脚本与图片的缩略图处理的实现
Mar 18 Servers
nginx常用配置conf的示例代码详解
Mar 21 Servers
Mac电脑OS系统下安装Nginx的详细教程
Apr 14 Servers
Linux中如何安装并部署Redis
Apr 18 Servers
IIS服务器中设置HTTP重定向访问HTTPS
Apr 29 Servers
CentOS7安装MySQL8的超级详细教程(无坑!)
Jun 10 Servers
在虚拟机中安装windows server 2008的图文教程
Jun 28 Servers
阿里云服务器(windows)手动部署FTP站点详细教程
Aug 05 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 session机制
2011/07/17 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
js实现左右轮播图
2020/01/09 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
Python中的高级函数map/reduce使用实例
2015/04/13 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
Python操作MongoDB详解及实例
2017/05/18 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
详解Python模块化编程与装饰器
2021/01/16 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
优秀乡村医生事迹材料
2014/05/28 职场文书
工地宣传标语
2014/06/18 职场文书
花坛标语大全
2014/06/30 职场文书
计算机求职信
2014/07/02 职场文书
相亲活动方案
2014/08/26 职场文书
最美护士演讲稿
2014/08/27 职场文书
岗位聘任协议书
2015/09/21 职场文书
七夕情人节问候语
2015/11/11 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
室外天线与收音机天线杆接合方法
2022/04/05 无线电