利用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快速入门教程
Mar 31 Servers
Nginx配置https原理及实现过程详解
Mar 31 Servers
nginx共享内存的机制详解
Mar 21 Servers
Vertica集成Apache Hudi重磅使用指南
Mar 31 Servers
nginx location 带斜杠【 / 】与不带的区别
Apr 13 Servers
Tomcat starup.bat 脚本实现开机自启动
Apr 20 Servers
nginx配置限速限流基于内置模块
May 02 Servers
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
May 11 Servers
Linux中文件的基本属性介绍
Jun 01 Servers
win server2012 r2服务器共享文件夹如何设置
Jun 21 Servers
windows server2008 开启端口的实现方法
Jun 25 Servers
服务器nginx权限被拒绝解决案例
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
留言板翻页的实现详解
2006/10/09 PHP
function.inc.php超越php
2006/12/09 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
javascript 函数式编程
2007/08/16 Javascript
Prototype中dom对象方法汇总
2008/09/17 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
jQuery 选择器理解
2010/03/16 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
npm的lock机制解析
2019/06/20 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
Python批量修改文件后缀的方法
2014/01/26 Python
python实现数组插入新元素的方法
2015/05/22 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
机械机修工岗位职责
2014/08/03 职场文书
升国旗演讲稿
2014/09/05 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
销售人员管理制度
2015/08/06 职场文书
寒假生活随笔
2015/08/15 职场文书
在 Python 中利用 Pool 进行多线程
2022/04/24 Python