利用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已编译的nginx-添加新模块
Apr 01 Servers
nginx反向代理配置去除前缀案例教程
Jul 26 Servers
学习nginx基础知识
Sep 04 Servers
iSCSI服务器CHAP双向认证配置
Apr 01 Servers
Docker官方工具docker-registry案例演示
Apr 13 Servers
KVM基础命令详解
Apr 30 Servers
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
Jun 01 Servers
Linux磁盘管理方法介绍
Jun 01 Servers
Apache POI操作批量导入MySQL数据库
Jun 21 Servers
设置IIS Express并发数
Jul 07 Servers
CentOS7设置ssh服务以及端口修改方式
Dec 24 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过滤html标记属性类用法实例
2014/09/23 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
JavaScript网页定位详解
2014/01/13 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Django在win10下的安装并创建工程
2017/11/20 Python
python+django加载静态网页模板解析
2017/12/12 Python
Python random模块用法解析及简单示例
2017/12/18 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
会计实习生自我鉴定
2013/12/12 职场文书
个人委托书范本
2014/04/02 职场文书
广播体操比赛主持词
2015/06/29 职场文书
施工现场安全管理制度
2015/08/05 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle
Nginx 匹配方式
2022/05/15 Servers
SpringBoot详解执行过程
2022/07/15 Java/Android