java资源池的实现
1、資源池
對(duì)于共享資源,有一個(gè)很著名的設(shè)計(jì)模式:資源池。該模式正是為了解決資源頻繁分配、釋放所造成的問題的。把該模式應(yīng)用到數(shù)據(jù)庫(kù)連接管理領(lǐng)域,就是建立一個(gè)數(shù)據(jù)庫(kù)連接池,提供一套高效的連接分配、使用策略,最終目標(biāo)是實(shí)現(xiàn)連接的高效、安全的復(fù)用。還有一類對(duì)象池大家可能不太了解,對(duì)于nio中有個(gè)堆外內(nèi)存,netty的ByteBuf對(duì)象的實(shí)現(xiàn)就是一個(gè)可復(fù)用的對(duì)象池來(lái)提高性能。連接池大家平時(shí)聽的多,使用也多,但是自己實(shí)現(xiàn)應(yīng)該比較少。
1.1 LinkedBlockingQueue應(yīng)用實(shí)例
并發(fā)庫(kù)中的BlockingQueue是一個(gè)比較好玩的類,顧名思義,就是阻塞隊(duì)列。該類主要提供了兩個(gè)方法put()和take(),前者將一個(gè)對(duì)象放到隊(duì)列中,如果隊(duì)列已經(jīng)滿了,就等待直到有空閑節(jié)點(diǎn);后者從head取一個(gè)對(duì)象,如果沒有對(duì)象,就等待直到有可取的對(duì)象。
一個(gè)簡(jiǎn)單的資源池可以使用LinkedBlockingQueue實(shí)現(xiàn),需要的對(duì)象如下:
ICommonPool : 定義通用池,借出對(duì)象和歸還對(duì)象
PoolFactory :對(duì)象工廠,負(fù)責(zé)創(chuàng)建和銷毀對(duì)象
PoolConfig : 對(duì)象池的配置(最大連接數(shù)和最小連接數(shù))
BaseCommonPool :對(duì)象池的主要基礎(chǔ)實(shí)現(xiàn)
1.2 commons-pool2實(shí)現(xiàn)資源池
PooledObject(池化對(duì)象) PooledObjectFactory(對(duì)象工廠) ObjectPool (對(duì)象池)
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.6.2</version> </dependency>使用
@Autowiredprivate TestObjectPool testObjectPool;public void test() {TestObject testObject = null;try {testObject = testObjectPool.borrowObject();//省略業(yè)務(wù)代碼...} catch (Exception e) {e.printStackTrace();} finally {if (testObject != null) {//最終歸還對(duì)象到對(duì)象池testObjectPool.returnObject(testObject);}}}注意:使用對(duì)象要,需要returnObject,為了方便管理,可以參考數(shù)據(jù)庫(kù)連接池的service層的設(shè)計(jì),當(dāng)service拋出異常時(shí),捕獲異常,釋放對(duì)象。
參考:
java對(duì)象池化技術(shù)
springboot使用commons-pool2實(shí)現(xiàn)對(duì)象池
commons-pools詳細(xì)參數(shù)配置
總結(jié)
以上是生活随笔為你收集整理的java资源池的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sýnesis™ Lite for Sn
- 下一篇: vue input 只允许输入整数、整数