欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java對(duì)象池管理方式common-pool2使用

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

common-pool2 使用

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

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

創(chuàng)建Conn對(duì)象池

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

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

工廠模式

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

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對(duì)象池管理,我們必須實(shí)現(xiàn){@link org.apache.commons.pool2.PooledObjectFactory}或者其子類
     * 這是一個(gè)工廠模式,告訴對(duì)象池怎樣去創(chuàng)建要管理的對(duì)象
     * <p/>
     * BasePooledObjectFactory 是對(duì){@link org.apache.commons.pool2.PooledObjectFactory}的一個(gè)基本實(shí)現(xiàn),我們可以繼承該類,減少一些方法的實(shí)現(xiàn)
     * <p/>
     * 在實(shí)現(xiàn){@link org.apache.commons.pool2.PooledObjectFactory}接口時(shí),我們一定要實(shí)現(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> {
        /**
         * 間接實(shí)現(xiàn){@link PooledObjectFactory#makeObject()}方法,表明怎樣創(chuàng)建需要管理對(duì)象
         */
        @Override
        public Conn create() throws Exception {
            return new Conn();
        }
        /**
         * 在common-pool2中為了統(tǒng)計(jì)管理的對(duì)象的一些信息,比如調(diào)用次數(shù),空閑時(shí)間,上次使用時(shí)間等,需要對(duì)管理的對(duì)象進(jìn)行包裝,然后在放入到對(duì)象池中
         *
         * @param obj 對(duì)象池要管理的對(duì)象
         * @return 返回包裝后的PooledObject對(duì)象
         */
        @Override
        public PooledObject<Conn> wrap(Conn obj) {
            return new DefaultPooledObject<Conn>(obj);
        }
    }

ConnPool池個(gè)性化配置

為了模擬的更真實(shí),ConnPool池可以讓使用者個(gè)性化配置

package com.peaceful.pool.demo;
    import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
    /**
     * common-pool2 使用方式
     * <p/>
     * {@link org.apache.commons.pool2.impl.GenericObjectPool}支持個(gè)性化配置,我們可以配置對(duì)象池中總共的對(duì)象數(shù),最大、最小空閑對(duì)象數(shù)等等
     * 這邊繼承{@link GenericObjectPoolConfig}是為了ConnPool也可以進(jìn)行個(gè)性化的配置
     *
     * @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);
        }
    }

對(duì)象工廠創(chuàng)建一個(gè)對(duì)象池實(shí)例

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

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

這樣一個(gè)就完成了整個(gè)ConnPool的編碼,下面我們?cè)趯懸粋€(gè)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();
            // 被歸還的對(duì)象的引用,不可以在次歸還
            // java.lang.IllegalStateException: Object has already been retured to this pool or is invalid
            try {
                connPool.returnObject(conn5);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

下面是ConnDemo的運(yùn)行結(jié)果

[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對(duì)象池common-pool2使用的詳細(xì)內(nèi)容,更多關(guān)于java對(duì)象池common-pool2的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IE8+SpringMVC文件上傳防止JSON下載

    IE8+SpringMVC文件上傳防止JSON下載

    這篇文章主要介紹了IE8+SpringMVC文件上傳防止JSON下載的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡要分析

    Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡要分析

    這篇文章主要介紹Java網(wǎng)絡(luò)編程中的IO模型阻塞與非阻塞簡要分析,文中附有示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列實(shí)例詳解

    Java數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的相關(guān)資料,算是作為用java描述數(shù)據(jù)結(jié)構(gòu)的一個(gè)開始,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • JAVA中的動(dòng)態(tài)代理使用詳解

    JAVA中的動(dòng)態(tài)代理使用詳解

    這篇文章主要介紹了JAVA中的動(dòng)態(tài)代理使用詳解,動(dòng)態(tài)代理提供了一種靈活且非侵入式的方式,可以對(duì)對(duì)象的行為進(jìn)行定制和擴(kuò)展,它在代碼重用、解耦和業(yè)務(wù)邏輯分離、性能優(yōu)化以及系統(tǒng)架構(gòu)中起到了重要的作用,,需要的朋友可以參考下
    2023-08-08
  • 解決微服務(wù)feign調(diào)用添加token的問題

    解決微服務(wù)feign調(diào)用添加token的問題

    這篇文章主要介紹了解決微服務(wù)feign調(diào)用添加token的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • @AutoConfigurationPackage與@ComponentScan注解區(qū)別

    @AutoConfigurationPackage與@ComponentScan注解區(qū)別

    這篇文章主要介紹了@AutoConfigurationPackage與@ComponentScan注解區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java8特性使用Function代替分支語句

    Java8特性使用Function代替分支語句

    這篇文章主要介紹了Java8特性使用Function代替分支語句,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 淺談java對(duì)象結(jié)構(gòu) 對(duì)象頭 Markword

    淺談java對(duì)象結(jié)構(gòu) 對(duì)象頭 Markword

    這篇文章主要介紹了淺談java對(duì)象結(jié)構(gòu) 對(duì)象頭 Markword,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 關(guān)于spring中aop的注解實(shí)現(xiàn)方法實(shí)例詳解

    關(guān)于spring中aop的注解實(shí)現(xiàn)方法實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于spring中aop的注解實(shí)現(xiàn)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起看看吧。
    2017-08-08
  • Spring Retry 重試實(shí)例詳解

    Spring Retry 重試實(shí)例詳解

    這篇文章主要介紹了Spring Retry 重試,使用方式有兩種分別是命令式和聲明式,本文通過實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10

最新評(píng)論