利用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的rewrite模块详解
Mar 31 Servers
Nginx 负载均衡是什么以及该如何配置
Mar 31 Servers
centos8安装nginx1.9.1的详细过程
Aug 02 Servers
Nginx缓存设置案例详解
Sep 15 Servers
Apache POI的基本使用详解
Nov 07 Servers
docker-compose部署Yapi的方法
Apr 08 Servers
nginx容器方式反向代理实战
Apr 18 Servers
windows server 2016 域环境搭建的方法步骤(图文)
Jun 25 Servers
Windows server 2012 NTP时间同步的实现
Jun 25 Servers
在虚拟机中安装windows server 2008的图文教程
Jun 28 Servers
Windows server 2003卸载和安装IIS的图文教程
Jul 15 Servers
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
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
收音机术语解释
2021/03/01 无线电
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
Python简单的制作图片验证码实例
2017/05/31 Python
Python面向对象类的继承实例详解
2018/06/27 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
服务承诺口号
2014/05/22 职场文书
机械工程师岗位职责
2014/06/16 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
MySQL去除密码登录告警的方法
2022/04/20 MySQL
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang