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

apache的commons-pool2原理與使用實踐記錄

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

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

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

一、核心原理與組件

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

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

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

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

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

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

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

對象生命周期管理流程
• 借出對象:

檢查空閑隊列是否存在有效對象;

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

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

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

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

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

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

添加依賴

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

實現(xiàn)對象工廠

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); // 檢查連接有效性
    }
}

配置對象池參數(shù)

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

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

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

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

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

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

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

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

• 資源泄漏防護:結(jié)合LeakDetectionHandler監(jiān)控未歸還的對象,設置removeAbandonedTimeout自動回收。

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

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

• 資源泄漏防護:結(jié)合LeakDetectionHandler監(jiān)控未歸還的對象,設置removeAbandonedTimeout自動回收。

四、典型應用場景

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

五、注意事項與最佳實踐

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

六、Lettuce 使用 Apache Commons Pool2

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

1、核心依賴配置

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

<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  # 獲取連接最大等待時間
        time-between-eviction-runs: 30000ms  # 空閑連接檢查周期

此配置會通過 LettuceConnectionFactory 自動創(chuàng)建連接池實例。

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

對于非 Spring 環(huán)境或需要自定義的場景,可手動創(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() 自動歸還
);
// 使用示例
try (StatefulRedisConnection<String, String> connection = pool.borrowObject()) {
    RedisCommands<String, String> commands = connection.sync();
    commands.set("key", "value");
}  // 此處自動調(diào)用 close() 歸還連接到池中

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

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

4、連接池生效驗證

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

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

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

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

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

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

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

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

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

6、擴展配置項

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

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

總結(jié)

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

Lettuce使用詳解

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

相關(guān)文章

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

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

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

    Windows10安裝Apache2.4的方法步驟

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

    Linux下SVN服務器自動更新文件到Web目錄的方法

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

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

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

    如何用logrotate管理每日增長的日志

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

    git clone--mirror同步橋詳解

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

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

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

    .httacces文件的配置技巧

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

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

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

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

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

最新評論

罗甸县| 莫力| 南京市| 长垣县| 安康市| 潼南县| 峡江县| 泸西县| 儋州市| 福泉市| 新巴尔虎右旗| 子洲县| 旬阳县| 左云县| 叙永县| 定西市| 临江市| 德清县| 获嘉县| 瑞安市| 新巴尔虎左旗| 延津县| 宁武县| 海盐县| 罗城| 交城县| 遵义县| 申扎县| 康定县| 玉山县| 巴中市| 新建县| 象山县| 临武县| 孟津县| 涞水县| 香格里拉县| 厦门市| 汉源县| 潼关县| 濉溪县|