一.pool項目 到底什么是 pool, 簡單來說, 就是先建立一些存在的 object, 放在 pool 之中, 當你有需要的時候, 可以從 pool 中直接獲取, 不需要重新建立.. 最常聽到的就是 database connection pooling, 因為建立數據庫連結是一件耗時的工作, 假如我們先把連結建立好, 就可以節省這一些時間。database connection pooling 即DBCP。 1.基礎類結構 pool的基礎類: public interface ObjectPool { Object borrowObject(); void returnObject(Object borrowed); } 主要擴展類: public interface KeyedObjectPool { Object borrowObject(Object key); void returnObject(Object key, Object borrowed); }按照key來索引pool的對象
基礎類僅提供了最基本的兩個函數,用來創建和返回pool對象。 2.實現的基本類 BaSEObjectPool--PoolableObjectFactory--BasePoolableObjectFactory KeyedObjectPool--KeyedPoolableObjectFactory--BaseKeyedPoolableObjectFactory StackObjectPool--StackKeyedObjectPool--可以在初始化創建實例,提供有限的 idle 數量 GenericObjectPool--GenericKeyedObjectPool--包含了設定 idle, active 的數量以及回收到pool中的設置 SoftReferenceObjectPool--可以隨需要進行增加,他的回收是由垃圾回收站進行的 總的來說,它提供了 Pool 的 API 主要有三個方面: 提供一般性的對象 pool 接口, 可以簡單地去使用和實現. 比如BaseObjectPool和KeyedObjectPool. 提供小工具可以建立模塊化的 pool. 比如StackObjectPool. 實現出一些通用性的 pool. 比如GenericObjectPool. 3.實現
/** * Dumps the contents of the {@link Reader} to a * String, closing the {@link Reader} when done. */ public String readToString(Reader in) throws IOException { StringBuffer buf = new StringBuffer(); try {
for( int c = in.read(); c != -1; c = in.read()) { buf.append((char)c); } return buf.toString(); } catch(IOException e) { throw e; } finally { try { in.close(); } catch (Exception e) { // ignored } } } }
public class StringBufferFactory extends BasePoolableObjectFactory { // for makeObject we′ll simply return a new buffer public Object makeObject() { return new StringBuffer(); }
// when an object is returned to the pool, // we′ll clear it out public void passivateObject(Object obj) { StringBuffer buf = (StringBuffer)obj; buf.setLength(0); }
// for all other methods, the no-op // implementation in BasePoolableObjectFactory // will suffice }
修改 ReaderUtil 由 StringBufferFactory Pool 得到 StringBuffer.
new ReaderUtil( new StackObjectPool( new StringBufferFactory() ) ) 5.總結 我們通常會在 io 的部分采用 pool 機制, 減少一些建立存取的時間, 對于最耗時的數據庫存取, 更是相對的重要,我將會在commons-DBCP專題進行介紹,本篇是本系列的第二篇,以后將陸續推出,下期主題就是DBCP,請繼續關注. 6.參考 -- 相關書目或相關文章 *Jakarta Commons: http://jakarta.apache.org/commons/ *Jakarta Commons Pool http://jakarta.apache.org/commons/pool/ *Jakarta Commons Pool API: http://jakarta.apache.org/commons/pool/apidocs/index.Html *Oreilly: Using the Jakarta Commons, Part 3: #3 http://www.onjava.com/pub/a/onjava/2003/07/23/commons.html?page=3