0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

池化技术的应用实践

jf_ro2CN3Fa ? 来源:稀土掘金技术社区 ? 2023-11-24 10:22 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1 一些废话

作为一名Java开发人员,池化技术或多或少在业务代码中使用。常见的包括线程池、连接池等。也是因为Java语言超级丰富的基建,基本上这些池化能力都有着相对成熟的“工具”。

比如,需要使用线程池的时候常常会选择Spring提供的 ThreadPoolTaskExecutor , 工具内部替我们维护了线程的生命周期与任务的状态变化。

线程池的运转流程图

f9c57a96-8a69-11ee-939d-92fbcf53809c.png

2 正文开始

在笔者的业务场景里,java服务需要通过命令行启动一个特殊进程,并在进程使用完后将其销毁。而业务对启动这个进程的整体耗时较为敏感,打算利用池化技术,将进程池化复用,去除启动进程的消耗,达到优化性能的目标。

f9e0251c-8a69-11ee-939d-92fbcf53809c.png

认识 GenericObjectPool

池化技术的概念大家可能都比较熟悉了,但真正要从零开始实现池化能力,就会感觉困难很多。好在Java丰富的基建在提供ThreadPoolTaskExecutor的同时,也提供了GenericObjectPool这个辅助我们实现自定义对象池化的工具。顺带提一句:JedisPool就是使用这个工具实现的。

GenericObjectPool构造方法一共就3个参数,只有PooledObjectFactory必传;

/**
*Createsanew{@codeGenericObjectPool}thattracksanddestroys
*objectsthatarecheckedout,butneverreturnedtothepool.
*
*@paramfactoryTheobjectfactorytobeusedtocreateobjectinstances
*usedbythispool
*@paramconfigThebasepoolconfigurationtouseforthispoolinstance.
*Theconfigurationisusedbyvalue.Subsequentchangesto
*theconfigurationobjectwillnotbereflectedinthe
*pool.
*@paramabandonedConfigConfigurationforabandonedobjectidentification
*andremoval.Theconfigurationisusedbyvalue.
*/
publicGenericObjectPool(finalPooledObjectFactoryfactory,
finalGenericObjectPoolConfigconfig,finalAbandonedConfigabandonedConfig){
}

PooledObjectFactory 按照方法注释的描述,它是专门负责给池子创建对象实例的。当然除了创建对象(makeObject), 还包括了检验、激活、销毁对象。基本涵盖了对象生命周期中的各个阶段。

voidactivateObject(PooledObjectp)throwsException;

voiddestroyObject(PooledObjectp)throwsException;

PooledObjectmakeObject()throwsException;

voidpassivateObject(PooledObjectp)throwsException;

booleanvalidateObject(PooledObjectp);

更加详细的说明可以浏览 GenericObjectPool's apidocs [1]。源码的注释也很详细值得一看。

使用 GenericObjectPool

先引入依赖


org.apache.commons
commons-pool2
${version}

根据自身业务实现PooledObjectFactory接口;作者的业务场景是进程池化,那么对应的创建对象、销毁对象的方法就是创建进程和销毁进程的代码。

publicclassMyProcessFactoryimplementsPooledObjectFactory{
@Override
publicvoiddestroyObject(PooledObjectp)throwsException{
finalMyProcessprocess=p.getObject();
if(null!=process){
//销毁进程
process.stop();
}
}

@Override
publicPooledObjectmakeObject()throwsException{
//这里就是去创建一个进程
MyProcessprocess=newMyProcess();
process.start();
returnnewDefaultPooledObject<>(process);
}

//剩下几个方法也可以按需实现
}

下一步就是构建 GenericObjectPool 实例

PooledObjectFactoryfactory=newMyProcessFactory();
GenericObjectPoolpool=newGenericObjectPool(factory);

使用GenericObjectPool

//获取进程实例
MyProcessprocess=pool.borrowObject();

//归还实例
pool.returnObject(process);

进阶使用 GenericObjectPoolConfig

顾名思义,GenericObjectPoolConfig是池化工具的配置类;它包含了池的最大容量、池的最大空闲数、最小空闲数等核心参数。除此之外在它的父类 BaseObjectPoolConfig 中,空闲对象检测规则,对象存放队列进出规则(LIFO)等更加细节的配置。

/**
*Thedefaultvalueforthe{@codemaxTotal}configurationattribute.
*@seeGenericObjectPool#getMaxTotal()
*/
publicstaticfinalintDEFAULT_MAX_TOTAL=8;

/**
*Thedefaultvalueforthe{@codemaxIdle}configurationattribute.
*@seeGenericObjectPool#getMaxIdle()
*/
publicstaticfinalintDEFAULT_MAX_IDLE=8;

/**
*Thedefaultvalueforthe{@codeminIdle}configurationattribute.
*@seeGenericObjectPool#getMinIdle()
*/
publicstaticfinalintDEFAULT_MIN_IDLE=0;

通过调整这些参数值,就能创建符合业务要求的池子。下面就是能常驻4个进程的一套配置参数。

privateGenericObjectPoolConfiggenericObjectPoolConfig(){
finalGenericObjectPoolConfigconfig=newGenericObjectPoolConfig<>();
config.setMaxTotal(20);//池的最大容量
config.setMaxIdle(4);//最大空闲连接数
config.setMinIdle(0);//最小空闲连接数
config.setMaxWait(Duration.ofSeconds(5));//获取对象时最大等待时间
config.setTimeBetweenEvictionRuns(Duration.ofMinutes(1));//空闲对象检查间隔
config.setMinEvictableIdleTime(Duration.ofMinutes(10));//空闲对象被移除的最小空闲时间
config.setTestOnBorrow(true);
config.setLifo(false);
returnconfig;
}

3 后续

当然真实的业务中还会有很多不相关的逻辑夹杂其中,上文基本涵盖了池化对象搭建与配置的实现方法。最终也实现了性能优化的目标。希望此文能为大家在池化运用多些帮助。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2989

    浏览量

    110762
  • 线程池
    +关注

    关注

    0

    文章

    57

    浏览量

    7158
  • 命令行
    +关注

    关注

    0

    文章

    81

    浏览量

    10590
  • 池化
    +关注

    关注

    0

    文章

    4

    浏览量

    1193
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    动态线程思想学习及实践

    相关文档 美团线程实践:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 线程思想解析:https
    的头像 发表于 06-13 15:43 ?1594次阅读
    动态线程<b class='flag-5'>池</b>思想学习及<b class='flag-5'>实践</b>

    买药秒送 JADE动态线程实践及原理浅析

    一、背景及JADE介绍 买药秒送是健康即时零售业务新的核心流量场域,面对京东首页高流量曝光,我们对频道页整个技术架构方案进行升级,保障接口高性能、系统高可用。 动态线程是买药频道应用的技术之一
    的头像 发表于 09-04 11:11 ?1223次阅读
    买药秒送 JADE动态线程<b class='flag-5'>池</b><b class='flag-5'>实践</b>及原理浅析

    OpenHarmony3.1 Release版本特性解析——OpenHarmony硬件资源架构介绍

    ,实现硬件互助、资源共享,为用户提供流畅的全场景体验。本期,我们通过介绍 OpenHarmony 的硬件资源框架,为大家揭晓 OpenHarmony 是如何实现多设备协同的。一、硬件资源访问的演进
    发表于 05-23 16:42

    分布式系统硬件资源原理和接入实践

    把各个设备的硬件外设抽象为外设信息单元,外设信息在各个可信设备之间自动同步,如此,实现了外设信息的全局可见;结合分布式硬件虚拟技术,实现任意设备之间的硬件外设能力跨设备调用;分布式硬件资源作为系统
    发表于 12-06 10:02

    鎘薄膜太陽能電

    鎘薄膜太陽能電
    发表于 02-08 00:35 ?8次下载

    基于CXL技术的大内存方案解析

    如果 FaceBoo k平台创建的TPP协议是正确的,那么它将有一个不同的内存分页系统,可以更好地解决由于在服务器主板之外有大量内存而带来的稍高的延迟。
    发表于 10-20 11:46 ?2587次阅读

    基于Nacos的简单动态线程实现

    本文以Nacos作为服务配置中心,以修改线程核心线程数、最大线程数为例,实现一个简单的动态线程
    发表于 01-06 14:14 ?1102次阅读

    公用包Commons Pool 2

    Redis 的常用客户端 Jedis,就是使用 Commons Pool 管理连接的,可以说是一个最佳实践。下图是 Jedis 使用工厂创建对象的主要代码块。对象工厂类最主要的方法就是
    的头像 发表于 05-04 10:36 ?1308次阅读
    公用<b class='flag-5'>池</b><b class='flag-5'>化</b>包Commons Pool 2

    卷积神经网络中的方式

    卷积神经网络的最基本结构有卷积层跟层,一般情况下,层的作用一般情况下就是下采样与像素迁移不变性。根据步长区分,
    的头像 发表于 10-21 09:42 ?1707次阅读
    卷积神经网络中的<b class='flag-5'>池</b><b class='flag-5'>化</b>方式

    什么是内存

    1什么是内存 1.1技术 所谓“技术”,就
    的头像 发表于 11-08 16:26 ?1445次阅读
    什么是内存<b class='flag-5'>池</b>

    高并发内存项目实现

    相关知识 1、技术 技术就是程序先向系统申请过量的资源,并将这些资源管理起来,避免频繁的
    的头像 发表于 11-09 11:16 ?1071次阅读
    高并发内存<b class='flag-5'>池</b>项目实现

    了解连接、线程、内存、异步请求

    技术 技术能够减少资源对象的创建次数,提?程序的响应性能,特别是在?并发下这种提?更加明
    的头像 发表于 11-09 14:44 ?1878次阅读
    了解连接<b class='flag-5'>池</b>、线程<b class='flag-5'>池</b>、内存<b class='flag-5'>池</b>、异步请求<b class='flag-5'>池</b>

    内存主要解决的问题

    内存的定义 1.技术 是在计算机技术中经常使用的一种设计模式,其内涵在于:将程序中需要
    的头像 发表于 11-13 15:23 ?1139次阅读
    内存<b class='flag-5'>池</b>主要解决的问题

    线程的运转流程图 技术实践案例解析

    作为一名Java开发人员,技术或多或少在业务代码中使用。常见的包括线程、连接等。也是因为Java语言超级丰富的基建,基本上这些
    的头像 发表于 11-24 10:22 ?732次阅读
    线程<b class='flag-5'>池</b>的运转流程图 <b class='flag-5'>池</b><b class='flag-5'>化</b><b class='flag-5'>技术</b><b class='flag-5'>实践</b>案例解析

    构建便捷海外IP代理:策略与实践

    构建便捷海外IP代理是一个涉及多方面策略与实践的过程。
    的头像 发表于 11-14 07:34 ?535次阅读