Java Pool
Java Pool
Java Pool是為了減少資源創建、初始化的系統開銷而採取的一種實現模式。
Java Pool(Java 池)
池(Pool)是為了減少資源創建、初始化的系統開銷而採取的一種實現模式,在Java中常見的池一般有:
我們需要使用Connection Pool的情況都通常都是指網路連接,比如:DB connection, Socket的Connection,這些對象往往需要使用Pool來管理,因為這些對象的重複創建需要較長的時間,是系統性能的瓶頸。
Connection Pool實現包括兩類:第一種是受管的Connection Pool,需要實現JCA的Resource Adapter規範,通過JNDI lookup出來ConnectionPool對象,然後調用受管ConnectionPool對象的getConnection方法獲得connection,第二種是自己實現一個Connection的Object Pool,通過自定義的ConnectionFactory類獲得一個connection。
第一種:受管的Connection Pool
目前J2EE Container中常用的connection pool有:
DB Connection Pool
JMSConnection Pool
LDAPConnection Pool
JCA Connection Pool
DB Connection Pool即JDBC connection pool,基本上所有的J2EE容器都提供了實現,JMS connection pool一般的JMS Server都提供了實現,LDAP connection pool由LDAP Server提供實現, JCA connection pool需要自己實現resource adapter。
第二種:實現一個Connection的Object Pool
通常可以在已有第三方的Object Pool上實現自己的Connection Pool,如apache的commons pool,如果非要從頭開始當然也是可以的。通常如果是要用規範的API獲取connection,如jdbc,jms,舉個例子:DriverManager.getConnection, Connection.close, 為了使這個Connection Pool可以方便地用在各種jdbc驅動上,而且為了使原來沒有使用該Connection Pool的應用可以方便地切換到該Connection Pool上,我們可能需要用到AOP,這樣DriverManager.getConnection就是從pool中取出connecton(如果pool中有的話),Connection.close就是return給pool,從邏輯上釋放。用OO的方法也是可以實現的。
應用程序可以有多個線程,這些線程在休眠狀態中需要耗費大量時間來等待事件發生。其他線程可能進入睡眠狀態,並且僅定期被喚醒以輪循更改或更新狀態信息,然後再次進入休眠狀態。為了簡化對這些線程的管理,.NET框架為每個進程提供了一個線程池,一個線程池有若干個等待操作狀態,當一個等待操作完成時,線程池中的輔助線程會執行回調函數。線程池中的線程由系統管理,程序員不需要費力於線程管理,可以集中精力處理應用程序任務。
線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然後在創建線程后自動啟動這些任務。線程池線程都是後台線程。每個線程都使用默認的堆棧大小,以默認的優先順序運行,並處於多線程單元中。如果某個線程在託管代碼中空閑(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間后創建另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成後才啟動。
2、實現池中元素的獲取、釋放功能;
3、實現池的finalize方法,保證系統在垃圾回收時正確回收目前處於idle狀態的資源,保證正在被使用的資源不被系統回收。