最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

apache的commons-pool2原理與使用實(shí)踐記錄

 更新時(shí)間:2025年05月30日 11:02:19   作者:有夢(mèng)想的攻城獅  
Apache?Commons?Pool2是一個(gè)高效的對(duì)象池化框架,通過復(fù)用昂貴資源(如數(shù)據(jù)庫連接、線程、網(wǎng)絡(luò)連接)優(yōu)化系統(tǒng)性能,這篇文章主要介紹了apache的commons-pool2原理與使用詳解,需要的朋友可以參考下

Apache Commons Pool2 是一個(gè)高效的對(duì)象池化框架,通過復(fù)用昂貴資源(如數(shù)據(jù)庫連接、線程、網(wǎng)絡(luò)連接)優(yōu)化系統(tǒng)性能。

前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站

一、核心原理與組件

三大核心模塊
• ObjectPool(對(duì)象池)

管理對(duì)象的生命周期,提供borrowObject()(借出)和returnObject()(歸還)方法,內(nèi)部通過LinkedBlockingDeque維護(hù)空閑對(duì)象隊(duì)列,并支持LIFO(默認(rèn))或FIFO策略。
• PooledObject(池化對(duì)象)

對(duì)原生對(duì)象的包裝類(如DefaultPooledObject),記錄對(duì)象狀態(tài)(IDLE、ALLOCATED、EVICTION等)、創(chuàng)建時(shí)間、最后使用時(shí)間等元數(shù)據(jù),便于池管理。
• PooledObjectFactory(對(duì)象工廠)

定義對(duì)象創(chuàng)建、銷毀、驗(yàn)證等邏輯,需用戶實(shí)現(xiàn)以下方法:
? makeObject():創(chuàng)建新對(duì)象并包裝為PooledObject

? destroyObject():銷毀不再可用的對(duì)象;

? validateObject():檢查對(duì)象是否有效;

? activateObject()/passivateObject():激活或鈍化對(duì)象狀態(tài)(如重置連接)。

對(duì)象生命周期管理流程
• 借出對(duì)象:

檢查空閑隊(duì)列是否存在有效對(duì)象;

若無效則銷毀,并創(chuàng)建新對(duì)象(未達(dá)maxTotal上限時(shí));

返回對(duì)象前調(diào)用activateObject()激活。
• 歸還對(duì)象:

調(diào)用validateObject()驗(yàn)證有效性;

若有效則passivateObject()鈍化后放回空閑隊(duì)列;

若空閑對(duì)象超過maxIdle或池已關(guān)閉,則銷毀對(duì)象。

二、使用步驟詳解(以數(shù)據(jù)庫連接池為例)

添加依賴

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.11.1</version>
</dependency>

實(shí)現(xiàn)對(duì)象工廠

public class ConnectionFactory extends BasePooledObjectFactory<Connection> {
    @Override
    public Connection create() throws Exception {
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/test");
    }
    @Override
    public PooledObject<Connection> wrap(Connection conn) {
        return new DefaultPooledObject<>(conn);
    }
    @Override
    public boolean validateObject(PooledObject<Connection> p) {
        return p.getObject().isValid(5); // 檢查連接有效性
    }
}

配置對(duì)象池參數(shù)

GenericObjectPoolConfig<Connection> config = new GenericObjectPoolConfig<>();
config.setMaxTotal(50);       // 最大對(duì)象數(shù)
config.setMaxIdle(10);        // 最大空閑數(shù)
config.setMinIdle(5);        // 最小空閑數(shù)
config.setTestWhileIdle(true); // 空閑時(shí)定期驗(yàn)證
config.setTimeBetweenEvictionRunsMillis(30000); // 驅(qū)逐檢查周期

創(chuàng)建池實(shí)例并操作

ObjectPool<Connection> pool = new GenericObjectPool<>(new ConnectionFactory(), config);
// 借出對(duì)象
Connection conn = pool.borrowObject();
// 使用對(duì)象執(zhí)行SQL...
// 歸還對(duì)象
pool.returnObject(conn);

三、高級(jí)配置與優(yōu)化

關(guān)鍵參數(shù)解析

參數(shù)名作用
maxTotal池中最大對(duì)象數(shù),防止資源耗盡
maxIdle / minIdle控制空閑對(duì)象數(shù)量,平衡資源占用與快速響應(yīng)
testOnBorrow / testOnReturn借出或歸還時(shí)驗(yàn)證對(duì)象有效性,確??捎眯缘黾友舆t
blockWhenExhausted資源耗盡時(shí)是否阻塞等待(maxWaitMillis設(shè)置超時(shí)時(shí)間)

性能優(yōu)化建議
• 避免頻繁驅(qū)逐:設(shè)置較長(zhǎng)的timeBetweenEvictionRunsMillis(如30秒),減少檢查開銷。

• 異步操作支持:通過GenericObjectPool的異步方法提升高并發(fā)場(chǎng)景下的吞吐量。

• 資源泄漏防護(hù):結(jié)合LeakDetectionHandler監(jiān)控未歸還的對(duì)象,設(shè)置removeAbandonedTimeout自動(dòng)回收。

性能優(yōu)化建議
• 避免頻繁驅(qū)逐:設(shè)置較長(zhǎng)的timeBetweenEvictionRunsMillis(如30秒),減少檢查開銷。

• 異步操作支持:通過GenericObjectPool的異步方法提升高并發(fā)場(chǎng)景下的吞吐量。

• 資源泄漏防護(hù):結(jié)合LeakDetectionHandler監(jiān)控未歸還的對(duì)象,設(shè)置removeAbandonedTimeout自動(dòng)回收。

四、典型應(yīng)用場(chǎng)景

數(shù)據(jù)庫連接池
如DBCP、HikariCP底層依賴Commons Pool2,復(fù)用連接減少TCP握手開銷。Redis客戶端連接池
Jedis通過JedisPool管理連接,避免頻繁創(chuàng)建Socket。FTP連接池
復(fù)用FTPClient對(duì)象,減少登錄/注銷開銷(需實(shí)現(xiàn)activateObject重置連接狀態(tài))。自定義資源池
如線程池、內(nèi)存緩存對(duì)象池,適用于創(chuàng)建成本高的對(duì)象。

五、注意事項(xiàng)與最佳實(shí)踐

資源泄漏處理
finally塊中確保returnObject()調(diào)用,或使用try-with-resources模式包裝池對(duì)象。異常管理
捕獲destroyObject()中的異常,避免因個(gè)別對(duì)象銷毀失敗影響整體池穩(wěn)定性。線程安全
GenericObjectPool內(nèi)部通過鎖機(jī)制保證并發(fā)安全,但自定義工廠需確保create()等方法的線程安全性。

六、Lettuce 使用 Apache Commons Pool2

Lettuce 是 Spring Boot 默認(rèn)的 Redis 客戶端,其本身通過 commons-pool2 提供連接池支持,適用于需要控制連接復(fù)用或處理阻塞操作的場(chǎng)景。以下是基于 commons-pool2 的 Lettuce 連接池完整使用實(shí)例及關(guān)鍵要點(diǎn):

1、核心依賴配置

Lettuce 連接池依賴 commons-pool2,需在項(xiàng)目中顯式引入:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.11.1</version>
</dependency>

若未添加此依賴,連接池功能將無法啟用。

2、連接池參數(shù)配置(YAML 示例)

在 Spring Boot 的 application.yml 中配置連接池參數(shù):

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    lettuce:
      pool:
        max-active: 20    # 最大活躍連接數(shù)
        max-idle: 10      # 最大空閑連接
        min-idle: 5       # 最小空閑連接
        max-wait: 5000ms  # 獲取連接最大等待時(shí)間
        time-between-eviction-runs: 30000ms  # 空閑連接檢查周期

此配置會(huì)通過 LettuceConnectionFactory 自動(dòng)創(chuàng)建連接池實(shí)例。

3、代碼實(shí)例:手動(dòng)創(chuàng)建連接池

對(duì)于非 Spring 環(huán)境或需要自定義的場(chǎng)景,可手動(dòng)創(chuàng)建 GenericObjectPool

// 創(chuàng)建 RedisClient
RedisClient client = RedisClient.create("redis://localhost:6379");
// 配置連接池參數(shù)
GenericObjectPoolConfig<StatefulRedisConnection<String, String>> poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMaxTotal(20);
poolConfig.setMaxIdle(10);
poolConfig.setMinIdle(5);
// 創(chuàng)建連接池(包裝連接模式)
GenericObjectPool<StatefulRedisConnection<String, String>> pool = ConnectionPoolSupport.createGenericObjectPool(
    () -> client.connect(),  // 連接工廠
    poolConfig,
    true  // 包裝連接,close() 自動(dòng)歸還
);
// 使用示例
try (StatefulRedisConnection<String, String> connection = pool.borrowObject()) {
    RedisCommands<String, String> commands = connection.sync();
    commands.set("key", "value");
}  // 此處自動(dòng)調(diào)用 close() 歸還連接到池中

• 包裝模式(wrapConnections=true):調(diào)用 connection.close() 時(shí)自動(dòng)歸還連接。

• 直接模式(wrapConnections=false):需手動(dòng)調(diào)用 pool.returnObject(connection) 歸還。

4、連接池生效驗(yàn)證

性能對(duì)比
插入大量數(shù)據(jù)時(shí),開啟連接池的執(zhí)行速度顯著快于單連接(如 1W 條數(shù)據(jù)耗時(shí)減少 30%+)。

連接數(shù)監(jiān)控
使用 redis-cli info clients 或 Linux 命令 lsof -i:6379 查看實(shí)際連接數(shù)。初始可能僅 1 個(gè)連接,隨壓力增加逐步升至 max-active,空閑后逐步回收至 min-idle。

5、關(guān)鍵注意事項(xiàng)

共享連接開關(guān)
Spring Boot 默認(rèn)開啟 shareNativeConnection,需在配置類中關(guān)閉以強(qiáng)制使用連接池:

@Bean
public LettuceConnectionFactory lettuceConnectionFactory() {
    LettuceConnectionFactory factory = new LettuceConnectionFactory();
    factory.setShareNativeConnection(false);  // 禁用共享連接
    return factory;
}

否則連接池配置可能不生效。

阻塞操作與事務(wù)
涉及 BLPOP、事務(wù)(MULTI/EXEC)等阻塞操作時(shí),必須使用連接池避免線程阻塞。

異常處理
• 確保 borrowObject()returnObject()try-finally 塊中調(diào)用,防止連接泄漏。

• 捕獲 RedisConnectionException 處理連接失效問題,配置 testWhileIdle 定期驗(yàn)證連接有效性。

6、擴(kuò)展配置項(xiàng)

參數(shù)名作用默認(rèn)值
max-active最大活躍連接數(shù)(并發(fā)上限)8
min-idle最小空閑連接(預(yù)熱保留)0
max-wait獲取連接超時(shí)時(shí)間(-1 表示無限等待)-1
time-between-eviction-runs空閑連接驅(qū)逐檢查周期禁用
test-on-borrow借出時(shí)是否驗(yàn)證連接有效性false

Lettuce 通過 commons-pool2 實(shí)現(xiàn)靈活連接池管理,適用于高并發(fā)或需要資源隔離的場(chǎng)景。在 Spring Boot 中通過 YAML 配置即可快速啟用,非 Spring 項(xiàng)目則需手動(dòng)創(chuàng)建 GenericObjectPool 并管理連接生命周期。關(guān)鍵點(diǎn)在于正確關(guān)閉共享連接、驗(yàn)證池化效果及處理阻塞操作,以充分發(fā)揮連接池的性能優(yōu)勢(shì)。

總結(jié)

Apache Commons Pool2通過標(biāo)準(zhǔn)化的對(duì)象池管理機(jī)制,顯著提升了高成本資源的使用效率。其核心在于對(duì)象復(fù)用與生命周期控制,結(jié)合靈活的配置參數(shù),可廣泛應(yīng)用于數(shù)據(jù)庫、網(wǎng)絡(luò)連接等場(chǎng)景。開發(fā)者需重點(diǎn)掌握工廠實(shí)現(xiàn)、池配置優(yōu)化及異常處理,以構(gòu)建高性能、穩(wěn)定的資源池。

Lettuce使用詳解

到此這篇關(guān)于apache的commons-pool2原理與使用詳解的文章就介紹到這了,更多相關(guān)apache的commons-pool2原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 虛擬機(jī)Centos7環(huán)境下實(shí)現(xiàn)安裝wget方式

    虛擬機(jī)Centos7環(huán)境下實(shí)現(xiàn)安裝wget方式

    wget是一款支持HTTP/HTTPS/FTP的下載工具,可后臺(tái)運(yùn)行,若虛擬機(jī)Linux缺少wget,可通過刪除舊版本、下載并安裝rpm包解決,最后驗(yàn)證安裝是否成功
    2025-07-07
  • Windows10安裝Apache2.4的方法步驟

    Windows10安裝Apache2.4的方法步驟

    本文主要介紹了Windows10安裝Apache2.4的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-06-06
  • Linux下SVN服務(wù)器自動(dòng)更新文件到Web目錄的方法

    Linux下SVN服務(wù)器自動(dòng)更新文件到Web目錄的方法

    這篇文章主要介紹了Linux下SVN服務(wù)器自動(dòng)更新文件到Web目錄的方法,需要的朋友可以參考下
    2015-07-07
  • 在CentOS上安裝搭建PHP+Apache+Mysql的服務(wù)器環(huán)境

    在CentOS上安裝搭建PHP+Apache+Mysql的服務(wù)器環(huán)境

    今天小編就為大家分享一篇關(guān)于在CentOS上安裝搭建PHP+Apache+Mysql的服務(wù)器環(huán)境,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 如何用logrotate管理每日增長(zhǎng)的日志

    如何用logrotate管理每日增長(zhǎng)的日志

    這篇文章主要介紹了如何用logrotate管理每日增長(zhǎng)的日志問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • git clone--mirror同步橋詳解

    git clone--mirror同步橋詳解

    該文章主要了Git倉(cāng)庫同步的幾種情況,包括保留mirror裸倉(cāng)庫、已刪除裸倉(cāng)庫以及只想同步新tag等場(chǎng)景,通過創(chuàng)建裸倉(cāng)庫、fetch分支/標(biāo)簽等方式實(shí)現(xiàn)代價(jià)較低的增量同步,并在需要時(shí)寫了長(zhǎng)期自動(dòng)同步的建議
    2026-05-05
  • Linux使用dd命令來復(fù)制和轉(zhuǎn)換數(shù)據(jù)的操作方法

    Linux使用dd命令來復(fù)制和轉(zhuǎn)換數(shù)據(jù)的操作方法

    Linux 中的 dd 命令是一個(gè)功能強(qiáng)大的數(shù)據(jù)復(fù)制和轉(zhuǎn)換實(shí)用程序,它以較低級(jí)別運(yùn)行,通常用于創(chuàng)建可啟動(dòng)的 USB 驅(qū)動(dòng)器、克隆磁盤和生成隨機(jī)數(shù)據(jù)等任務(wù),本文給大家介紹了Linux 如何使用dd命令來復(fù)制和轉(zhuǎn)換數(shù)據(jù),需要的朋友可以參考下
    2025-01-01
  • .httacces文件的配置技巧

    .httacces文件的配置技巧

    我要介紹的.htaccess的第一個(gè)應(yīng)用是自定義錯(cuò)誤頁面,這將使你可以擁有自己的、個(gè)性化的錯(cuò)誤頁面(例如找不到文件時(shí)),而不是你的服務(wù)商提供的錯(cuò)誤頁或沒有任何頁面。
    2008-06-06
  • centos7利用yum安裝lnmp的教程(linux+nginx+php7.1+mysql5.7)

    centos7利用yum安裝lnmp的教程(linux+nginx+php7.1+mysql5.7)

    lnmp相信不用多介紹了,大家應(yīng)該都知道,下面這篇文章主要給大家介紹了關(guān)于centos7利用yum安裝lnmp(linux+nginx+php7.1+mysql5.7)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-03-03
  • linux系統(tǒng)之如何禁用usb口

    linux系統(tǒng)之如何禁用usb口

    這篇文章主要介紹了linux系統(tǒng)之如何禁用usb口問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

桃园市| 安康市| 望城县| 万源市| 佛冈县| 晋州市| 噶尔县| 柏乡县| 京山县| 鄂伦春自治旗| 炉霍县| 建湖县| 晴隆县| 玛沁县| 台北县| 福清市| 富源县| 工布江达县| 峨边| 许昌市| 家居| 西峡县| 青州市| 汾西县| 密山市| 潜江市| 仪陇县| 大英县| 江北区| 黑河市| 凤山市| 元阳县| 方城县| 克什克腾旗| 江口县| 兖州市| 弥渡县| 历史| 平定县| 静乐县| 丰都县|