摘要:使用提供了中對象池管理方式,它們的使用方式基本一樣,這里以對象池為例介紹其使用方式,一般實現自己的對象池需要經過個步驟實現接口該接口是一種工廠模式,實現其目的是讓對象池通過該工廠模式創建管理的對象創建對象池實例創建對象池我們假設對象是一
common-pool2 使用
common-pool2提供了3中對象池管理方式,它們的使用方式基本一樣,這里以GenericObjectPool對象池為例介紹其使用方式,一般實現自己的對象池需要經過2個步驟
實現PooledObjectFactory接口:該接口是一種工廠模式,實現其目的是讓對象池通過該工廠模式創建管理的對象
創建對象池(GenericObjectPool(PooledObjectFactory))實例
創建Conn對象池我們假設Conn對象是一個建立TCP連接的對象,該對象的初始化時間平均為500ms,為了避免在程序中頻繁創建Conn對象,我們需要借助對象池管理Conn對象實例
import org.slf4j.LoggerFactory; /** * common-pool2 使用方式 * * 假設這是一個建立TCP連接的對象,該對象的初始化時間平均為500ms,為了避免在程序中頻繁創建Conn對象,我們需要借助對象池管理Conn對象實例 * * @author WangJun利用工廠模式,使對象池通過該工廠模式創建管理的對象* @version 1.0 15/10/28 * @since 1.6 */ public class Conn { /** * 記錄對象的創建時間 */ private long createTime; /** * 初始化Conn對象,模擬創建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); } }
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 使用方式 * * 為了使用common-pool2對象池管理,我們必須實現{@link org.apache.commons.pool2.PooledObjectFactory}或者其子類 * 這是一個工廠模式,告訴對象池怎樣去創建要管理的對象 * * BasePooledObjectFactory 是對{@link org.apache.commons.pool2.PooledObjectFactory}的一個基本實現,我們可以繼承該類,減少一些方法的實現 * * 在實現{@link org.apache.commons.pool2.PooledObjectFactory}接口時,我們一定要實現的接口方法是{@link PooledObjectFactory#makeObject()}方法。 * * @author WangJun為了模擬的更真實,ConnPool池可以讓使用者個性化配置* @version 1.0 15/10/28 * @since 1.6 */ public class ConnFactory extends BasePooledObjectFactory { /** * 間接實現{@link PooledObjectFactory#makeObject()}方法,表明怎樣創建需要管理對象 */ @Override public Conn create() throws Exception { return new Conn(); } /** * 在common-pool2中為了統計管理的對象的一些信息,比如調用次數,空閑時間,上次使用時間等,需要對管理的對象進行包裝,然后在放入到對象池中 * * @param obj 對象池要管理的對象 * @return 返回包裝后的PooledObject對象 */ @Override public PooledObject wrap(Conn obj) { return new DefaultPooledObject (obj); } }
package com.peaceful.pool.demo; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; /** * common-pool2 使用方式 * * {@link org.apache.commons.pool2.impl.GenericObjectPool}支持個性化配置,我們可以配置對象池中總共的對象數,最大、最小空閑對象數等等 * 這邊繼承{@link GenericObjectPoolConfig}是為了ConnPool也可以進行個性化的配置 * * @author WangJun有了創建對象的工廠,我們就可以創建一個對象池實例* @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); } }
package com.peaceful.pool.demo; import org.apache.commons.pool2.impl.GenericObjectPool; /** * common-pool2 使用方式 * * Conn對象管理池,這里利用GenericObjectPool作為對象池 * * @author WangJun這樣一個就完成了整個ConnPool的編碼,下面我們在寫一個demo,演示使用ConnPool* @version 1.0 15/10/28 * @since 1.6 */ public class ConnPool extends GenericObjectPool { /** * 調用{@link GenericObjectPool}的構造方法,構造ConnPool */ public ConnPool() { super(new ConnFactory(), new ConnPoolConfig()); } /** * 調用{@link GenericObjectPool}的構造方法,構造ConnPool */ public ConnPool(ConnPoolConfig connPoolConfig) { super(new ConnFactory(), connPoolConfig); } }
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)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64712.html
摘要:單例與對象池的區別首先單例和對象池的目的都是為了避免頻繁的創建對象帶來的系統的開銷。池借組與引用可以在內存吃緊時被自動回收來管理對象池中的對象,它可以隨著對對象的需要而不斷增加。 common-pool2 池技術 池技術,主要用于管理對象,做到對象可以重用,避免多次創建對象的開銷,是一種比較常用的技術。比如DB數據源的連接池。 在Java中頻繁的創建對象和銷毀對象都會消耗性能。為了避免...
摘要:四種引用類型在中,類型就分為兩種,基本類型和引用類型或自定義類型。軟引用可用來實現內存敏感的高速緩存。一般用法是程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。 Java四種引用類型 在java中,類型就分為兩種,基本類型和引用類型或自定義類型。 引用類型又分為四種: 強引用 StrongReference 軟引用 SoftReference 若...
摘要:目前主流的數據庫連接池有等幾種。默認值初始化連接池中的連接數,取值應在與之間,默認為最大空閑時間秒內未使用則連接被丟棄。當連接池中的連接耗盡的時候一次同時獲取的連接數。每秒檢查所有連接池中的空閑連接。 一、數據庫連接池 數據庫連接池的基本思想就是為數據庫連接建立一個緩沖池,預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需要從緩沖池中取出一個,使用完之后在放回去,節省連接建...
摘要:第二集非必選持續集成編譯打包部署到線上環境集成前言在持續集成第一集中講解了關于如果編譯,打包,發布包到私服。在下面一集中,也就是第二集中,開始講解如何持續集成可運行的服務包到測試和正式環境。 第二集 hudson+gradle+git+maven(非必選)持續集成編譯,打包,部署到線上環境集成 前言 在持續集成第一集中,講解了關于如果編譯,打包,發布jar包到maven私服。在下面一集...
閱讀 3548·2021-08-31 09:39
閱讀 1854·2019-08-30 13:14
閱讀 2919·2019-08-30 13:02
閱讀 2769·2019-08-29 13:22
閱讀 2341·2019-08-26 13:54
閱讀 767·2019-08-26 13:45
閱讀 1586·2019-08-26 11:00
閱讀 982·2019-08-26 10:58