色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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
    +關注

    關注

    19

    文章

    2966

    瀏覽量

    104702
  • 線程池
    +關注

    關注

    0

    文章

    57

    瀏覽量

    6844
  • 命令行
    +關注

    關注

    0

    文章

    77

    瀏覽量

    10385
  • 池化
    +關注

    關注

    0

    文章

    4

    瀏覽量

    1100
收藏 人收藏

    評論

    相關推薦

    動態線程思想學習及實踐

    相關文檔 美團線程實踐:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 線程思想解析:https
    的頭像 發表于 06-13 15:43 ?1181次閱讀
    動態線程<b class='flag-5'>池</b>思想學習及<b class='flag-5'>實踐</b>

    買藥秒送 JADE動態線程實踐及原理淺析

    一、背景及JADE介紹 買藥秒送是健康即時零售業務新的核心流量場域,面對京東首頁高流量曝光,我們對頻道頁整個技術架構方案進行升級,保障接口高性能、系統高可用。 動態線程是買藥頻道應用的技術之一
    的頭像 發表于 09-04 11:11 ?830次閱讀
    買藥秒送 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 ?2093次閱讀

    基于Nacos的簡單動態線程實現

    本文以Nacos作為服務配置中心,以修改線程核心線程數、最大線程數為例,實現一個簡單的動態線程
    發表于 01-06 14:14 ?863次閱讀

    公用包Commons Pool 2

    Redis 的常用客戶端 Jedis,就是使用 Commons Pool 管理連接的,可以說是一個最佳實踐。下圖是 Jedis 使用工廠創建對象的主要代碼塊。對象工廠類最主要的方法就是
    的頭像 發表于 05-04 10:36 ?1016次閱讀
    公用<b class='flag-5'>池</b><b class='flag-5'>化</b>包Commons Pool 2

    卷積神經網絡中的方式

    卷積神經網絡的最基本結構有卷積層跟層,一般情況下,層的作用一般情況下就是下采樣與像素遷移不變性。根據步長區分,
    的頭像 發表于 10-21 09:42 ?1043次閱讀
    卷積神經網絡中的<b class='flag-5'>池</b><b class='flag-5'>化</b>方式

    什么是內存

    1什么是內存 1.1技術 所謂“技術”,就
    的頭像 發表于 11-08 16:26 ?897次閱讀
    什么是內存<b class='flag-5'>池</b>

    高并發內存項目實現

    相關知識 1、技術 技術就是程序先向系統申請過量的資源,并將這些資源管理起來,避免頻繁的
    的頭像 發表于 11-09 11:16 ?712次閱讀
    高并發內存<b class='flag-5'>池</b>項目實現

    了解連接、線程、內存、異步請求

    技術 技術能夠減少資源對象的創建次數,提?程序的響應性能,特別是在?并發下這種提?更加明
    的頭像 發表于 11-09 14:44 ?1308次閱讀
    了解連接<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 ?700次閱讀
    內存<b class='flag-5'>池</b>主要解決的問題

    線程的運轉流程圖 技術實踐案例解析

    作為一名Java開發人員,技術或多或少在業務代碼中使用。常見的包括線程、連接等。也是因為Java語言超級豐富的基建,基本上這些
    的頭像 發表于 11-24 10:22 ?465次閱讀
    線程<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 ?130次閱讀
    主站蜘蛛池模板: 孕妇泬出白浆18P| 偷窥欧美wc经典tv| 97影院理论午夜伦不卡偷| 久久AV国产麻豆HD真实| 一色狗影院| 久久学生精品国产自在拍| 中文字幕欧美日韩VA免费视频| 久久热这里面只有精品| 云南14学生真实初次破初视频| 久热在线这里只有精品7| 0951影音在线| 男男校园园bl文全肉高h寝室| 99久久精品免费国产一区二区三区 | 最近免费视频中文2019完整版 | 午夜看片网| 国产亚洲精品高清视频免费| 亚洲精品第五页中文字幕| 国偷自产视频一区二区99| 亚洲三级视频在线| 久青草影院| tobu中国日本高清| 色欲AV精品一区二区入口| 国产精品18久久久久久欧美网址| 亚洲 自拍 偷拍 另类综合图区| 国产真实乱对白精彩| 一个人免费完整在线观看影院| 菊地凛子av| 边做边爱免费视频| 午夜福利合集1000在线| 国语92电影网午夜福利| 中文字幕精品AV内射夜夜夜| 女女破视频在线观看| 出租屋自拍贵在真实15P| 午夜理伦片免费| 久久成人免费观看草草影院| 97超在线视频| 入禽太深免费观看| 国产在线视频在线观看| 2019天天射干| 肉欲横流(NP高H)| 含羞草传媒在线观看|