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

java對象池管理方式common-pool2使用

 更新時間:2023年05月17日 11:48:56   作者:wangjuntytl  
這篇文章主要為大家介紹了java對象池common-pool2使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

common-pool2 使用

common-pool2提供了3中對象池管理方式,它們的使用方式基本一樣,這里以GenericObjectPool對象池為例介紹其使用方式,一般實現(xiàn)自己的對象池需要經(jīng)過2個步驟

  • 實現(xiàn)PooledObjectFactory接口:該接口是一種工廠模式,實現(xiàn)其目的是讓對象池通過該工廠模式創(chuàng)建管理的對象
  • 創(chuàng)建對象池(GenericObjectPool(PooledObjectFactory))實例

創(chuàng)建Conn對象池

我們假設Conn對象是一個建立TCP連接的對象,該對象的初始化時間平均為500ms,為了避免在程序中頻繁創(chuàng)建Conn對象,我們需要借助對象池管理Conn對象實例

import org.slf4j.LoggerFactory;
/**
 * common-pool2 使用方式
 * <p/>
 * 假設這是一個建立TCP連接的對象,該對象的初始化時間平均為500ms,為了避免在程序中頻繁創(chuàng)建Conn對象,我們需要借助對象池管理Conn對象實例
 *
 * @author WangJun <wangjuntytl@163.com>
 * @version 1.0 15/10/28
 * @since 1.6
 */
public class Conn {
    /**
     * 記錄對象的創(chuàng)建時間
     */
    private long createTime;
    /**
     * 初始化Conn對象,模擬創(chuàng)建Conn對象平均消耗500ms
     * @throws InterruptedException
     */
    public Conn() throws InterruptedException {
        Thread.sleep(500);
        createTime = System.currentTimeMillis();
        LoggerFactory.getLogger(getClass()).debug(" init conn suc... " + createTime);
    }
    /**
     * 報告Conn對象信息
     */
    public void report() {
        LoggerFactory.getLogger(getClass()).info("this is a available conn " + createTime);
    }
}

工廠模式

利用工廠模式,使對象池通過該工廠模式創(chuàng)建管理的對象

package com.peaceful.pool.demo;
    import org.apache.commons.pool2.BasePooledObjectFactory;
    import org.apache.commons.pool2.PooledObject;
    import org.apache.commons.pool2.PooledObjectFactory;
    import org.apache.commons.pool2.impl.DefaultPooledObject;
    /**
     * common-pool2 使用方式
     * <p/>
     * 為了使用common-pool2對象池管理,我們必須實現(xiàn){@link org.apache.commons.pool2.PooledObjectFactory}或者其子類
     * 這是一個工廠模式,告訴對象池怎樣去創(chuàng)建要管理的對象
     * <p/>
     * BasePooledObjectFactory 是對{@link org.apache.commons.pool2.PooledObjectFactory}的一個基本實現(xiàn),我們可以繼承該類,減少一些方法的實現(xiàn)
     * <p/>
     * 在實現(xiàn){@link org.apache.commons.pool2.PooledObjectFactory}接口時,我們一定要實現(xiàn)的接口方法是{@link PooledObjectFactory#makeObject()}方法。
     *
     * @author WangJun <wangjuntytl@163.com>
     * @version 1.0 15/10/28
     * @since 1.6
     */
    public class ConnFactory extends BasePooledObjectFactory<Conn> {
        /**
         * 間接實現(xiàn){@link PooledObjectFactory#makeObject()}方法,表明怎樣創(chuàng)建需要管理對象
         */
        @Override
        public Conn create() throws Exception {
            return new Conn();
        }
        /**
         * 在common-pool2中為了統(tǒng)計管理的對象的一些信息,比如調用次數(shù),空閑時間,上次使用時間等,需要對管理的對象進行包裝,然后在放入到對象池中
         *
         * @param obj 對象池要管理的對象
         * @return 返回包裝后的PooledObject對象
         */
        @Override
        public PooledObject<Conn> wrap(Conn obj) {
            return new DefaultPooledObject<Conn>(obj);
        }
    }

ConnPool池個性化配置

為了模擬的更真實,ConnPool池可以讓使用者個性化配置

package com.peaceful.pool.demo;
    import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
    /**
     * common-pool2 使用方式
     * <p/>
     * {@link org.apache.commons.pool2.impl.GenericObjectPool}支持個性化配置,我們可以配置對象池中總共的對象數(shù),最大、最小空閑對象數(shù)等等
     * 這邊繼承{@link GenericObjectPoolConfig}是為了ConnPool也可以進行個性化的配置
     *
     * @author WangJun <wangjuntytl@163.com>
     * @version 1.0 15/10/28
     * @since 1.6
     */
    public class ConnPoolConfig extends GenericObjectPoolConfig {
        public ConnPoolConfig() {
            // defaults to make your life with connection pool easier :)
            setMinIdle(5);
            setTestOnBorrow(true);
        }
    }

對象工廠創(chuàng)建一個對象池實例

有了創(chuàng)建對象的工廠,我們就可以創(chuàng)建一個對象池實例

package com.peaceful.pool.demo;
    import org.apache.commons.pool2.impl.GenericObjectPool;
    /**
     * common-pool2 使用方式
     * <p/>
     * Conn對象管理池,這里利用GenericObjectPool作為對象池
     *
     * @author WangJun <wangjuntytl@163.com>
     * @version 1.0 15/10/28
     * @since 1.6
     */
    public class ConnPool extends GenericObjectPool<Conn> {
        /**
         * 調用{@link GenericObjectPool}的構造方法,構造ConnPool
         */
        public ConnPool() {
            super(new ConnFactory(), new ConnPoolConfig());
        }
        /**
         * 調用{@link GenericObjectPool}的構造方法,構造ConnPool
         */
        public ConnPool(ConnPoolConfig connPoolConfig) {
            super(new ConnFactory(), connPoolConfig);
        }
    }

這樣一個就完成了整個ConnPool的編碼,下面我們在寫一個demo,演示使用ConnPool

public class ConnDemo {
        public static void main(String[] args) throws Exception {
            ConnPoolConfig connPoolConfig = new ConnPoolConfig();
            connPoolConfig.setMinIdle(5);
            connPoolConfig.setMaxIdle(8);
            ConnPool connPool = new ConnPool(connPoolConfig);
            Conn conn1 = connPool.borrowObject();
            Conn conn2 = connPool.borrowObject();
            Conn conn3 = connPool.borrowObject();
            Conn conn4 = connPool.borrowObject();
            Conn conn5 = connPool.borrowObject();
            conn1.report();
            connPool.returnObject(conn1);
            conn2.report();
            connPool.returnObject(conn2);
            conn3.report();
            connPool.returnObject(conn3);
            conn4.report();
            connPool.returnObject(conn4);
            conn5.report();
            connPool.returnObject(conn5);
            conn5.report();
            // 被歸還的對象的引用,不可以在次歸還
            // java.lang.IllegalStateException: Object has already been retured to this pool or is invalid
            try {
                connPool.returnObject(conn5);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

下面是ConnDemo的運行結果

[2015-10-28 14:56:06 DEBUG]  {com.peaceful.pool.demo.Conn:18}- init conn suc...
[2015-10-28 14:56:07 DEBUG]  {com.peaceful.pool.demo.Conn:18}- init conn suc...
[2015-10-28 14:56:07 DEBUG]  {com.peaceful.pool.demo.Conn:18}- init conn suc...
[2015-10-28 14:56:08 DEBUG]  {com.peaceful.pool.demo.Conn:18}- init conn suc...
[2015-10-28 14:56:08 DEBUG]  {com.peaceful.pool.demo.Conn:18}- init conn suc...
[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015366746
[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015367346
[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015367853
[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015368354
[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015368860
[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015368860
java.lang.IllegalStateException: Object has already been retured to this pool or is invalid
    at org.apache.commons.pool2.impl.GenericObjectPool.returnObject(GenericObjectPool.java:595)
    at com.peaceful.pool.demo.ConnDemo.main(ConnDemo.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

以上就是java對象池common-pool2使用的詳細內容,更多關于java對象池common-pool2的資料請關注腳本之家其它相關文章!

相關文章

  • 解決lombok的@Data注解無法打印繼承的父類信息問題

    解決lombok的@Data注解無法打印繼承的父類信息問題

    在Java編程中,使用@Data注解可能導致子類繼承父類屬性后,打印只顯示子類信息不顯示父類信息,問題源于@Data注解作用域僅限于當前類,解決方法包括使用@ToString(callSuper=true)注解或重寫toString方法
    2024-11-11
  • Java Lambda表達式之從集合到流

    Java Lambda表達式之從集合到流

    這篇文章主要介紹了Java Lambda表達式之從集合到流知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • SpringBoot實現(xiàn)微信支付接口調用及回調函數(shù)(商戶參數(shù)獲取)

    SpringBoot實現(xiàn)微信支付接口調用及回調函數(shù)(商戶參數(shù)獲取)

    本文詳細介紹了使用SpringBoot實現(xiàn)微信支付接口調用及回調函數(shù)的步驟,提供了代碼實現(xiàn)的具體步驟和工具類的創(chuàng)建,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • SpringBoot中@Conditional注解的使用

    SpringBoot中@Conditional注解的使用

    這篇文章主要介紹了SpringBoot中@Conditional注解的使用,@Conditional注解是一個條件裝配注解,主要用于限制@Bean注解在什么時候才生效,以指定的條件形式控制bean的創(chuàng)建,需要的朋友可以參考下
    2024-01-01
  • 項目依賴Springboot jar失敗解決方案

    項目依賴Springboot jar失敗解決方案

    這篇文章主要介紹了項目依賴Springboot jar失敗解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot 集成MQTT實現(xiàn)消息訂閱的詳細代碼

    SpringBoot 集成MQTT實現(xiàn)消息訂閱的詳細代碼

    本文介紹了如何在SpringBoot中集成MQTT并實現(xiàn)消息訂閱,主要步驟包括添加依賴、配置文件設置、啟動類注解、MQTT配置類、消息處理器配置、主題緩存、動態(tài)數(shù)據(jù)庫主題配置以及消息處理服務,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Java之PreparedStatement的使用詳解

    Java之PreparedStatement的使用詳解

    這篇文章主要介紹了Java之PreparedStatement的使用詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • Java如何在不存在文件夾的目錄下創(chuàng)建文件

    Java如何在不存在文件夾的目錄下創(chuàng)建文件

    這篇文章主要介紹了Java如何在不存在文件夾的目錄下創(chuàng)建文件,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-08-08
  • SpringBoot中swagger的使用

    SpringBoot中swagger的使用

    這篇文章主要介紹了SpringBoot中swagger的使用,文中有非常詳細的代碼示例,對正在學習swagger的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • 深入理解java泛型詳解

    深入理解java泛型詳解

    這篇文章主要介紹了Java中的泛型詳解,什么是泛型,作用以及基礎實例等,喜歡的朋友可以參考
    2017-04-04

最新評論

泰顺县| 织金县| 莆田市| 贵州省| 枣阳市| 井陉县| 东山县| 民勤县| 桐乡市| 衢州市| 洱源县| 东海县| 盐亭县| 房产| 禹城市| 策勒县| 阳信县| 新津县| 扎赉特旗| 衡阳市| 洪雅县| 通化市| 白河县| 沙田区| 南和县| 梅河口市| 罗山县| 晋城| 瑞昌市| 潜江市| 越西县| 屏南县| 凌源市| 中西区| 瑞安市| 松溪县| 日土县| 普兰县| 泗洪县| 大荔县| 元阳县|