java對(duì)象池管理方式common-pool2使用
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的編碼,下面我們在寫一個(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)文章
SpringBoot實(shí)現(xiàn)微信支付接口調(diào)用及回調(diào)函數(shù)(商戶參數(shù)獲取)
本文詳細(xì)介紹了使用SpringBoot實(shí)現(xiàn)微信支付接口調(diào)用及回調(diào)函數(shù)的步驟,提供了代碼實(shí)現(xiàn)的具體步驟和工具類的創(chuàng)建,感興趣的朋友跟隨小編一起看看吧2024-11-11
項(xiàng)目依賴Springboot jar失敗解決方案
這篇文章主要介紹了項(xiàng)目依賴Springboot jar失敗解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
SpringBoot 集成MQTT實(shí)現(xiàn)消息訂閱的詳細(xì)代碼
本文介紹了如何在SpringBoot中集成MQTT并實(shí)現(xiàn)消息訂閱,主要步驟包括添加依賴、配置文件設(shè)置、啟動(dòng)類注解、MQTT配置類、消息處理器配置、主題緩存、動(dòng)態(tài)數(shù)據(jù)庫主題配置以及消息處理服務(wù),感興趣的朋友跟隨小編一起看看吧2024-11-11

