偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

聊聊對(duì)象池框架 commons pool2

開發(fā) 架構(gòu)
Apache Commons Pool 提供了通用對(duì)象池的實(shí)現(xiàn),用于管理和復(fù)用對(duì)象,以提高系統(tǒng)的性能和資源利用率。

當(dāng)資源對(duì)象的創(chuàng)建/銷毀比較耗時(shí)的場(chǎng)景下,可以通過"池化"技術(shù),達(dá)到資源的復(fù)用,以此來減少系統(tǒng)的開銷、增大系統(tǒng)吞吐量,比如數(shù)據(jù)庫(kù)連接池、線程池、Redis 連接池等都是使用的該方式。

Apache Commons Pool 提供了通用對(duì)象池的實(shí)現(xiàn),用于管理和復(fù)用對(duì)象,以提高系統(tǒng)的性能和資源利用率。

圖片圖片

1.基礎(chǔ)用法

1.1 添加依賴

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

1.2 定義對(duì)象工廠

PooledObjectFactory 是一個(gè)池化對(duì)象工廠接口,定義了生成對(duì)象、激活對(duì)象、鈍化對(duì)象、銷毀對(duì)象的方法,如下:

public interface PooledObjectFactory<T> {

/**
   * Creates an instance that can be served by the pool and wrap it in a
   */
PooledObject<T> makeObject() throws Exception;

/**
   * Destroys an instance no longer needed by the pool
   */
void destroyObject(PooledObject<T> p) throws Exception;

/**
   * Ensures that the instance is safe to be returned by the pool
   */
boolean validateObject(PooledObject<T> p);

/**
   * Reinitializes an instance to be returned by the pool
   */
void activateObject(PooledObject<T> p) throws Exception;

/**
   * Uninitializes an instance to be returned to the idle object pool
   */
void passivateObject(PooledObject<T> p) throws Exception;
}

以下是一個(gè)簡(jiǎn)單的示例:

  • 定義需要池化的對(duì)象 MyObject
public class MyObject {

    private String uid = UUID.randomUUID().toString();

    privatevolatileboolean valid = true;

    public void initialize() {
        System.out.println("初始化對(duì)象" + uid);
        valid = true;
    }

    public void destroy() {
        System.out.println("銷毀對(duì)象" + uid);
        valid = false;
    }

    public boolean isValid() {
        return valid;
    }

    public String getUid() {
        return uid;
    }

}
  • 定義對(duì)象工廠
public class MyObjectFactory implements PooledObjectFactory<MyObject> {

    @Override
    public PooledObject<MyObject> makeObject() throws Exception {
        // 創(chuàng)建一個(gè)新對(duì)象
        MyObject object = new MyObject();
        // 初始化對(duì)象
        object.initialize();
        returnnew DefaultPooledObject<>(object);
    }

    @Override
    public void destroyObject(PooledObject<MyObject> p) throws Exception {
        // 銷毀對(duì)象
        p.getObject().destroy();
    }

    @Override
    public boolean validateObject(PooledObject<MyObject> p) {
        return p.getObject().isValid();
    }

    @Override
    public void activateObject(PooledObject<MyObject> p) throws Exception {
    }

    @Override
    public void passivateObject(PooledObject<MyObject> p) throws Exception {
    }

}

1.3 配置對(duì)象池

創(chuàng)建 GenericObjectPool 對(duì)象,并設(shè)置相關(guān)參數(shù),如最大對(duì)象數(shù)量、最小空閑對(duì)象數(shù)量等。

GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(5);
config.setTestWhileIdle(true);
config.setMinEvictableIdleTimeMillis(60000L);
GenericObjectPool<MyObject> pool = new GenericObjectPool<>(new MyObjectFactory(), config);

1.4 借用和歸還對(duì)象

MyObject myObject = null;
try {
    myObject = pool.borrowObject();
    System.out.println("get對(duì)象" + myObject.getUid() +  " thread:" + Thread.*currentThread*().getName());
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        if (myObject != null) {
            pool.returnObject(myObject);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2.Jedis 連接池

Jedis 是一個(gè) Java 語言的 Redis 客戶端庫(kù)。它提供了一組易于使用的 API,可以用來連接和操作 Redis 數(shù)據(jù)庫(kù)。

它的內(nèi)部使用 Commons Pool 來管理 Redis 連接 ,我們使用 jedis 3.3.0 版本寫一個(gè)簡(jiǎn)單的示例。

public class JedisMain {
    public static void main(String[] args) throws Exception{
        // 創(chuàng)建連接池配置
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(100);
        config.setMaxIdle(20);
        // 創(chuàng)建連接池
        JedisPool pool = new JedisPool(config, "localhost", 6379);
        // 獲取連接
        Jedis jedis = pool.getResource();
        jedis.set("hello" , "張勇");
        // 使用連接
        String value = jedis.get("hello");
        System.out.println(value);
        // 歸還連接
        jedis.close();
        // 關(guān)閉連接池
        // pool.close();
        Thread.sleep(5000);
    }
}

如下圖,JedisFactory 實(shí)現(xiàn)了對(duì)象工廠,實(shí)現(xiàn)了創(chuàng)建對(duì)象、銷毀對(duì)象、驗(yàn)證對(duì)象、激活對(duì)象四個(gè)方法。

圖片圖片

比如驗(yàn)證對(duì)象方法,邏輯是調(diào)用 Jedis 的 ping 方法,判斷該連接是否存活。

3.原理解析

我們重點(diǎn)解析 GenericObjectPool 類的原理。

3.1 初始化

public GenericObjectPool(
            final PooledObjectFactory<T> factory,
            final GenericObjectPoolConfig<T> config) {
     super(config, ONAME_BASE, config.getJmxNamePrefix());
     if (factory == null) {
          jmxUnregister(); // tidy up
          thrownew IllegalArgumentException("factory may not be null");
     }
     this.factory = factory;
     idleObjects = new LinkedBlockingDeque<>(config.getFairness());
     setConfig(config);
 }

privatefinal Map<IdentityWrapper<T>, PooledObject<T>> allObjects =
        new ConcurrentHashMap<>();

初始化做三件事情:

  • 初始化 JedisFactory 工廠對(duì)象。
  • 對(duì)象容器 idleObjects , 類型是 LinkedBlockingDeque 。因此存儲(chǔ)容器有兩個(gè),所有的對(duì)象 allObjects 和空閑對(duì)象 idleObjects (可以直接取出使用)。
  • 配置對(duì)象池屬性 。

3.2 創(chuàng)建對(duì)象

我們關(guān)注 GenericObjectPool 類的 borrowObject 方法。

圖片圖片

邏輯其實(shí)很簡(jiǎn)單 :

  • 從容器中獲取第一個(gè)條目對(duì)象,若沒有獲取,則調(diào)用工廠對(duì)象的創(chuàng)建對(duì)象方法,并將該對(duì)象加入到全局對(duì)象 Map。
  • 創(chuàng)建成功后,調(diào)用對(duì)象的激活方法,接著驗(yàn)證對(duì)象的可靠性,最后將對(duì)象返回。

3.3 歸還連接

圖片圖片

流程如下:

  • 判斷返還對(duì)象時(shí)是否校驗(yàn),假如校驗(yàn)失敗,則銷毀該對(duì)象,將該對(duì)象從存儲(chǔ)容器中刪除 ;
  • 調(diào)用工廠對(duì)象的激活對(duì)象方法 ;
  • 若空閑對(duì)象 Map 元素大小達(dá)到最大值,則銷毀該對(duì)象,將該對(duì)象從存儲(chǔ)容器中刪除 ;
  • 正常將對(duì)象放回到空閑對(duì)象容器 idleObjects 。
責(zé)任編輯:武曉燕 來源: 勇哥Java實(shí)戰(zhàn)
相關(guān)推薦

2017-04-19 11:22:11

demoPool2Java

2021-11-29 09:38:12

設(shè)計(jì)模式對(duì)象池模式Object Pool

2025-02-28 08:46:24

框架微服務(wù)架構(gòu)

2017-02-27 16:43:34

Golang多線程編程

2019-06-24 05:05:40

緩沖池查詢數(shù)據(jù)InnoDB

2022-03-22 15:05:15

MySQL緩沖池

2022-02-09 11:02:16

JavaScript前端框架

2021-10-17 22:40:51

JavaScript開發(fā) 框架

2021-04-20 08:01:35

5W2H方法框架

2024-12-03 10:21:56

2023-10-07 15:56:49

三鏈表緩存頁(yè)flush鏈表

2024-06-11 09:22:51

2024-05-11 11:18:21

Kafka監(jiān)控框架

2021-02-01 08:28:24

Linux線程池Linux系統(tǒng)

2022-08-29 09:06:43

hippo4j動(dòng)態(tài)線程池

2010-03-31 10:07:09

Oracle shar

2021-10-27 11:29:49

Linux框架內(nèi)核

2018-03-27 10:06:26

對(duì)象存儲(chǔ)演進(jìn)

2022-12-12 08:42:06

Java對(duì)象棧內(nèi)存

2025-05-09 09:05:00

Spring框架設(shè)計(jì)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)