1. 程式人生 > >common-pool2物件池的詳解與使用

common-pool2物件池的詳解與使用

我們在伺服器開發的過程中,往往會有一些物件,它的建立和初始化需要的時間比較長,比如資料庫連線,網路IO,大資料物件等。在大量使用這些物件時,如果不採用一些技術優化,就會造成一些不可忽略的效能影響。一種辦法就是使用物件池,每次建立的物件並不實際銷燬,而是快取在物件池中,下次使用的時候,不用再重新建立,直接從物件池的快取中取即可。為了避免重新造輪子,我們可以使用優秀的開源物件池化元件apache-common-pool2,它對物件池化操作進行了很好的封裝,我們只需要根據自己的業務需求重寫或實現部分介面即可,使用它可以快速的建立一個方便,簡單,強大物件連線池管理類。

一,common-pool2簡介

首先是下載這個元件,使用maven引入下面依賴即可:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->

<dependency>

   <groupId>org.apache.commons</groupId>

   <artifactId>commons-pool2</artifactId>

   <version>2.4.2</version>

</dependency>

Common-pool2中的程式碼不是太多,有幾個種要的介面和實現類,

common-pool2使用的是面向介面的程式設計,它為我們提供的是一個抽象的物件池管理方式,所以根據我們業務的不同,我們需要重寫或實現一些方法和介面,我們一個一個看一下。

1GenericObjectPool

這個是物件池實現的核心類,它實現了對物件池的管理,是一個基本的物件池實現,一般情況下,我們可以直接使用。在使用這個類的時候,我們需要傳入兩個重要的引數:GenericObjectPoolConfig類和PooledObjectFactory介面的實現,一會我們再詳細說這兩個。

GenericObjectPool中,有兩個我們會用到的方法:

public T borrowObject() throws Exception從物件池中獲取一個物件

public void returnObject(T obj)物件使用完之後,歸還到物件池,

其它還有一些方法,比如關閉物件池,銷燬物件池,獲取物件池中空閒的物件個數等,可以自行檢視API

這個介面是我們要實現的,它對要實現物件池化的物件做了一些管理。這個工廠介面就是為了讓我們根據自己的業務建立和管理要物件池化的物件。

PooledObject<T>  makeObject() throws Exception;

這個方法是用來建立一個物件,當在GenericObjectPool類中呼叫borrowObject方法時,如果當前物件池中沒有空閒的物件,GenericObjectPool會呼叫這個方法,建立一個物件,並把這個物件封裝到PooledObject類中,並交給物件池管理。

void destroyObject(PooledObject<T> p) throws Exception;

銷燬物件,當物件池檢測到某個物件的空閒時間(idle)超時,或使用完物件歸還到物件池之前被檢測到物件已經無效時,就會呼叫這個方法銷燬物件。物件的銷燬一般和業務相關,但必須明確的是,當呼叫這個方法之後,物件的生命週期必須結果。如果是物件是執行緒,執行緒必須已結束,如果是socketsocket必須已close,如果是檔案操作,檔案資料必須已flush,且檔案正常關閉。

boolean validateObject(PooledObject<T> p);

檢測一個物件是否有效。在物件池中的物件必須是有效的,這個有效的概念是,從物件池中拿出的物件是可用的。比如,如果是socket,那麼必須保證socket是連線可用的。在從物件池獲取物件或歸還物件到物件池時,會呼叫這個方法,判斷物件是否有效,如果無效就會銷燬。

void activateObject(PooledObject<T> p) throws Exception;

啟用一個物件或者說啟動物件的某些操作。比如,如果物件是socket,如果socket沒有連線,或意外斷開了,可以在這裡啟動socket的連線。它會在檢測空閒物件的時候,如果設定了測試空閒物件是否可以用,就會呼叫這個方法,在borrowObject的時候也會呼叫。另外,如果物件是一個包含引數的物件,可以在這裡進行初始化。讓使用者感覺這是一個新建立的物件一樣。

void passivateObject(PooledObject<T> p) throws Exception;

鈍化一個物件。在向物件池歸還一個物件是會呼叫這個方法。這裡可以對物件做一些清理操作。比如清理掉過期的資料,下次獲得物件時,不受舊資料的影響。

一般來說activateObjectpassivateObject是成對出現的。前者是在物件從物件池取出時做一些操作,後者是在物件歸還到物件池做一些操作,可以根據自己的業務需要進行取捨。

3,帶Key的物件池GenericKeyedObjectPool

這種物件池和前面的GenericObjectPool物件池操作是一樣的,不同的是對應的每個方法帶一個key引數。你可以把這個GenericKeyedObjectPool的物件池看作是一個mapGenericObjectPool,每個key對應一個GenericObjectPool。它用於區別不同型別的物件。比如資料庫連線,有可能會連線到不同地址的資料庫上面。就可以用這個區分。

4,引數配置類GenericObjectPoolConfig

這個類允許使用者對物件池的一些引數進行調整,根據需要定製物件池。下面說逐一說一下每個引數的含義。

lifo:物件池儲存空閒物件是使用的LinkedBlockingDeque,它本質上是一個支援FIFOFILO的雙向的佇列,common-pool2中的LinkedBlockingDeque不是Java原生的佇列,而有common-pool2重新寫的一個雙向佇列。如果為true,表示使用FIFO獲取物件。預設值是true.建議使用預設值。

fairnesscommon-pool2實現的LinkedBlockingDeque雙向阻塞佇列使用的是Lock鎖。這個引數就是表示在例項化一個LinkedBlockingDeque時,是否使用lock的公平鎖。預設值是false,建議使用預設值。

maxWaitMillis:當沒有空閒連線時,獲取一個物件的最大等待時間。如果這個值小於0,則永不超時,一直等待,直到有空閒物件到來。如果大於0,則等待maxWaitMillis長時間,如果沒有空閒物件,將丟擲NoSuchElementException異常。預設值是-1;可以根據需要自己調整,單位是毫秒。

minEvictableIdleTimeMillis:物件最小的空閒時間。如果為小於等於0,最Long的最大值,如果大於0,當空閒的時間大於這個值時,執行移除這個物件操作。預設值是1000L * 60L * 30L;30分鐘。這個引數是強制性的,只要空閒時間超過這個值,就會移除。

softMinEvictableIdleTimeMillis:物件最小的空間時間,如果小於等於0,取Long的最大值,如果大於0,當物件的空閒時間超過這個值,並且當前空閒物件的數量大於最小空閒數量(minIdle)時,執行移除操作。這個和上面的minEvictableIdleTimeMillis的區別是,它會保留最小的空閒物件數量。而上面的不會,是強制性移除的。預設值是-1

numTestsPerEvictionRun:檢測空閒物件執行緒每次檢測的空閒物件的數量。預設值是3;如果這個值小於0,則每次檢測的空閒物件數量等於當前空閒物件數量除以這個值的絕對值,並對結果向上取整。

testOnCreate:在建立物件時檢測物件是否有效,true是,預設值是false

testOnBorrow:在從物件池獲取物件時是否檢測物件有效,true是;預設值是false

testOnReturn:在向物件池中歸還物件時是否檢測物件有效,true是,預設值是false

testWhileIdle:在檢測空閒物件執行緒檢測到物件不需要移除時,是否檢測物件的有效性。true是,預設值是false

timeBetweenEvictionRunsMillis:空閒物件檢測執行緒的執行週期,即多長時候執行一次空閒物件檢測。單位是毫秒數。如果小於等於0,則不執行檢測執行緒。預設值是-1;

blockWhenExhausted:當物件池沒有空閒物件時,新的獲取物件的請求是否阻塞。true阻塞。預設值是true;

maxTotal:物件池中管理的最多物件個數。預設值是8

maxIdle:物件池中最大的空閒物件個數。預設值是8

minIdle:物件池中最小的空閒物件個數。預設值是0

以上就是common-pool2物件池的配置引數,使用的時候可以根據自己的需要進行調整。

5common-pool2的應用

使用common-pool2的物件池技術的一個完美例子就是redisJava客戶端JedisPool。大家可以下載Jedis的包,檢視原始碼進行學習。下次我將分享一個我使用common-pool2實現的一個thrift客戶端呼叫的連線池實現。

綜上所述,使用common-pool2可以快速的建立一個安全,強大,簡單的物件池管理類。它的開源性使它的功能得到了眾多專案的檢測,是非常安全的。在我們的業務中,如果有需要使用物件池化的操作,可以使用common-pool2快速實現。

遊戲技術網公眾號,掃描加入討論遊戲技術


相關推薦

common-pool2物件使用

我們在伺服器開發的過程中,往往會有一些物件,它的建立和初始化需要的時間比較長,比如資料庫連線,網路IO,大資料物件等。在大量使用這些物件時,如果不採用一些技術優化,就會造成一些不可忽略的效能影響。一種辦法就是使用物件池,每次建立的物件並不實際銷燬,而是快取在物件池中,下次使

HttpSession物件實戰操作

HttpSession物件:      HttpSession是當一個使用者第一次訪問某個網站通過HttoServletRequest中呼叫getSession方法建立的   1.    getSession有倆個過載方法:            getSession(

資料庫連線程式碼實現

一、資料庫連線池概念        資料庫連線池:負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是再重新建立一個;釋放空閒時間超過最大空閒時間的資料庫連線來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。這項技術能明顯提高對資料庫操作的效

java四種執行緒使用

1、什麼是執行緒池 在解釋什麼是執行緒池前,再贅述下什麼是執行緒: 1、執行緒:現代作業系統在執行一個程式時, 會為其建立一個程序。 例如, 啟動一個Java程式, 作業系統就會建立一個Java進 程。 現代作業系統排程的最小單元是執行緒, 也叫輕量級程序(Light

連接,c3p0dbcp的區別!

次數 數據庫連接池 data 的區別 其中 數據庫服務 耗時 JD cto 連接池: 連接池是創建和管理一個連接的緩沖池的技術,這些連接準備好被任何需要它們的線程使用。這項技術能明顯提高對數據庫操作的性能。 連接池的好處:(1)對於大多數應用程序,當它們正在處理事務

幹貨 | Tomcat 連接數線程

非阻塞 取出 http1 pri num 應用層 close wait 支持 前言 在使用tomcat時,經常會遇到連接數、線程數之類的配置問題,要真正理解這些概念,必須先了解Tomcat的連接器(Connector)。 在前面的文章 詳解Tomcat配置文件server.

Tomcat 連線數執行緒 | BIO/NIO有何不同 | 簡談Kafka中的NIO網路通訊模型

前言 在使用tomcat時,經常會遇到連線數、執行緒數之類的配置問題,要真正理解這些概念,必須先了解Tomcat的聯結器(Connector)。 在前面的文章 詳解Tomcat配置檔案server.xml 中寫到過:Connector的主要功能,是接收連線請求,建立Req

杜鵬的個人部落格 Flex使用BlazedsJava互動及自定義物件轉換

一、建立Flex與Java互動的工程。   本文中講到的互動是利用Blazeds的,因為這個是免費的,呵呵,我是窮人。   首先就是去下載Blazeds的壓縮包,這個可以從官網或者CSDN、JavaEye上下到。解壓縮這個包,將裡面的Blazeds.war解壓,後面建立工程時要使用。   在MyEclips

連線,c3p0dbcp的區別!

連線池:    連線池是建立和管理一個連線的緩衝池的技術,這些連線準備好被任何需要它們的執行緒使用。這項技術能明顯提高對資料庫操作的效能。  連線池的好處:(1)對於大多數應用程式,當它們正在處理事務時,僅需要能夠訪問JDBC連線的 1 個執行緒。當不處理事務時,這個連線就會

資料庫連線原理自定義連線實現

實現原理資料庫連線池在初始化時將建立一定數量的資料庫連線放到連線池中,這些資料庫連線的數量是由最小資料庫連線數制約。無論這些資料庫連線是否被使用,連線池都將一直保證至少擁有這麼多的連線數量。連線池的最大資料庫連線數量限定了這個連線池能佔有的最大連線數,當應用程式向連線池請求的連

python子進程模塊subprocess應用實例 之三

app 命令執行 windows rom not tput 一個 網絡 shell命令 二、應用實例解析 2.1 subprocess模塊的使用 1. subprocess.call >>> subprocess.call(["ls", "-l"]) 0

Java常量

回收 array 數值 編譯期 二進制格式 new 保持 占用 get 轉自:http://www.cnblogs.com/iyangyuan/p/4631696.html jvm虛擬內存分布圖: 程序計數器:JVM執行程序的流水線。 本地方法棧:JVM調用操作系統方法所

#20 ifconfig、route、netstat、ip、ss命令修改主機名網卡配置文件

ifconfig、route、netstat、ip、ss命令詳解與修改主機名與網卡配置文件 網絡的結構: 硬件:計算機、互聯設備、網絡設備 軟件:操作系統、協議、應用程序、數據庫 網絡的功能: 資源共享:目的 數據通信:手段 網絡通信模型 ISO/OSI: 應用層

centos/linux alternativesupdate-alternatives軟件版本切換

等等 ava 包括 blank 多個 config etc 兩種模式 版權 update-alternatives是linux系統中專門維護系統命令鏈接符的工具,通過它可以很方便的設置系統默認使用哪個命令、哪個軟件版本,比如,我們在系統中同時安裝了open jdk和

iptablesCentos7 關閉防火墻

tex new color sta pos firewalld 如果 火墻 blog http://www.cnblogs.com/metoy/p/4320813.html CentOS 7.0默認使用的是firewall作為防火墻,使用iptables必須重新設

#26 Linux kernel(內核)uname、lsmod、modinfo、depmod、insmod、rmmod、modprobe...命令用法

linux kernel(內核)詳解與uname、lsmod、modinfo、depmod、insmod、rmmod、modprobe...命令用法Linux kernel: 內核設計流派: 單內核設計,但是充分借鑒了微內核體系設計的優點,為內核引入了模塊化機制,內核高度模塊化; 內核被模塊化之

Linux下的監控器之一Ganglia部署

集群 服務器 監控器 Ganglia基礎詳解Ganglia介紹 Ganglia是一個跨平臺可擴展的,高性能計算系統下的分布式監控系統,如集群和網格。它是基於分層設計,它使用廣泛的技術,如XML數據代表,便攜數據傳輸,RRDtool用於數據存儲和可視化。它利用精心設計的數據結構和算法實現每節點間並發

px em rem的區別

聲明 -c -s 項目 屏幕分辨率 div 推薦 項目開發 pre 在前端項目開發中,px,em,以及rem都是頁面布局常用的單位,雖然它們是長度單位,但是所含的意義不一樣。通過復習和查閱,總結了以下知識。 px像素(Pixel)     定義:相對長度單位

[js高手之路] dom常用節點屬性兼容性應用

asc 子元素 種類型 process 變色 tex 如果 結構 節點和 一、每個DOM節點都有一個nodeType屬性,表示節點類型, NodeType一共有12種類型,我們可以通過遍歷內置的Node構造函數獲取 1 window.onload =

[crash防護] KVO crash

eval nat new mat not 自身 init 步驟 Coding 一、KVO介紹 KVO(Key-Value Observing),鍵值監聽。它提供一種機制:指定的被觀察者的屬性被改變後,KVO就會通知觀察者,觀察者可以做出響應。   KVO作用:利