Java Opensources for Web Development Part I:Chapter 2 Java Opensource Database
Lession 9 : 連結池設計
在中大型企業系統的開發設計之中,往往會遇到資料庫的存取瓶頸,除了調校資料庫存取的 SQL 指令之外,避免一次性存取大量的資料等技巧之外 ,我們還可以利用連結池設計的方式,先預設建立與資料庫連結,這方法,最主要的是減少與資料庫存取前的溝通與資料驗證等手續。現在在各主要的 JavaEE Application Server,都預設了這方面的功能,可以透過 JNDI 取得相關的 Datasource,進行資料庫的存取作業。
但是很多 Pooling 技巧與方法,都是由 Opensources 所引領風範的, 例如 proxool、c3p0、或是 jakarta 之中的 commons-dbcp 都是其中的代表性專案。以完整度來說,proxool 很適合一般的需求與應用,c3p0是 Hibernate 內建的 Connection Pooling 機制,然而 jakarta commons-dbcp 則是應用在 Tomcat 的標準模組之內。我們可以參考 commons-dbcp 的設計之中,是使用 commons-pool 的一些暫借與歸還的觀念,實作出 PoolingDataSource,各種的 DataSource 都是實作 J2SE 1.4 之後 javax.sql.DataSource 這個介面。主要來說,我們需要得到的是資料庫的 Connection,所以 getConnection() 是不可或缺的一個 method。所以我們在程式之中,應該就是
<%的方式來取得 Connection,另外加上我們將 DataSource 設定在 Application Server 之中,可以調整相關的 Connection Pooling 設定值之外,還可以調整相關資料庫的 URL 或是其他設定(如帳號、密碼等等),可以避免資料庫設定變更,需要進行大規模的程式異動。
DataSource ds = JNDI.lookup(“jdbc/SampleDataSource”);
Connection conn = ds.getConnection();
%>
至於 proxool 的變化更多,除了使用各種設定檔格式將相關的設定 connection pooling 之外,也可利用 ProxoolFacade 去註冊相關的設定。另外比較吸引我的功能,應該是可以監看目前 Pooling 的使用狀況,因為常常會要進行效能檢視,商業的 Application Server 通常會有提供,至於類似 tomcat 這種 opensources 的 JSP/Servlet Container,就缺乏類似的 GUI 操作介面,因此,不想使用 Application Server 內建的機制,就可以考慮採用 proxool。
最後,由 mchange 這間公司所提供的 opensource connection pooling – c3p0 ,隨著 Hibernate 的流行,讓 c3p0 也大放異采。基本上,只要在 hibernate 的設定檔 – hibernate.cfg.xml 之中設定。
<property name="c3p0.acquire_increment">1</property>便可以使用到相關的連結池功能。當然,如果你希望使用 proxool 和 commons-dbcp 作為 hibernate 的 pooling 機制,也是可以的。或是當你希望自行撰寫更適合自己的 connection pooling 機制,只要 implements net.sf.hibernate.connection.ConnectionProvider 這個介面即可。
<property name="c3p0.idle_test_period">100</property>
<property name="c3p0.max_size">100</property>
<property name="c3p0.max_statements">0</property>
<property name="c3p0.min_size">10</property>
<property name="c3p0.timeout">100</property>
總之,利用連結池,就是希望我們有更好資料庫連結效能,有了這些小工具,搭配壓力測試來調整相關 Max 與 Min (初始)的設定值, 加上資料庫的效能評估,應該就能讓你的系統不花吹灰之力,就可以減少許多資料存取的負擔。