當我們透過 JDBC 連結單一資料庫的時候,需要用到 connection pooling 來增加存取的速度。但是當整個系統存在多個資料庫的同時,我們該如何有效運用資料庫之間的運作呢?基本上當面對的是多台主機,我們處理存取資料的架構設計中,不外乎 Load Balance 與 Fail Over 為了就是要達到高可用性 (High Availabilty)。無論在主機的處理或是程式的運算之中,都可以利用 Cluster 叢集的方式來達到這些目的,然而,JavaEE 也有定義 Cluster 的技術,例如 Http-
Session、EJB 與 JMS 等等。在 Tomcat 5.x 之中,其實也實作了HttpSession 的 clustering 的設計,不再是商業 Application Server 的專利。資料庫存放了重要的資料,也常常會有多台資料庫在一套系統之中,往往購置的是同一廠牌的資料庫,如 Oracle 本身就提供了很好的 clustering 的技術,讓資料庫的服務永遠不會因為一台機器的異常而中斷。但是,我們在運用資料庫的同時,面對的是不同廠牌的資料庫,是否有工具讓我們來處理與設計為 clustering呢?很高興的,ObjectWeb 提供了 c-jdbc 這個專案專門解決這個問題。
C-JDBC 的設計如附圖
{mosimage}
由圖可以看到,透過直接 jdbc 的連結,很容易因為資料庫是單一的,缺乏容錯性與錯誤處理,如果有多台資料庫主機,何嘗不透過C-JDBC Controller 來增加系統對資料庫的容錯處理以及提供相關的Cache 與 Logging 機制。對於企業來說,當你想要在多台資料庫之間建置 cluster 就得花上額外的費用,然而 C-JDBC 是免費的。
C-JDBC 的下載:https://c-jdbc.objectweb.org/download.html
當我們解開 zip 檔案之後,可以將 /drivers/c-jdbc-driver.jar放置和原本的 JDBC Driver 一樣的位置,也許是擺在 /WEB-INF/lib/或 %Server%/lib 之下。另外,原本可以是透過 JDBC Driver class存取資料庫的地方,變更為 org.objectweb.cjdbc.driver.Driver。
另外,你的觀念可以將所有的資料庫思考為一個資料庫,透過 c-jdbc的整合,只需要懂得如何與 c-jdbc 連結。 c-jdbc 預設的連結埠是25322,所以 JDBC URL 的位置就是變更為 jdbc:cjdbc://localhost:25322/mydatabase;user=dbuser;password=pwd 這種形式。
透過 c-jdbc 不但可以運用在各種 application server 的設定檔讓程式透過 JNDI 存取 DataSource,也可以和 Hibernate 運用。另外,資料面的部份也可以存取 BLOB 與 CLOB 等形式,也可以透過設定將TRUE/FALSE 用 1/0 來存放。所以,我們不用學習太多的新技術,就可以很容易的使用 c-jdbc 取代掉原有的 jdbc driver。
最後,讓我們啟動 c-jdbc/bin/ 的 controller.bat,這樣就可以看到它已經聆聽預設的 port 25322,不過這樣是不足夠,主要來說,我們要設定後端的資料庫,必須在 先在 /config/virtualdatabase/設定相關的 資料庫 連結訊息文件,而後 在/config/controller.xml設定相關的 Virtual Database 對應關係,便可以重新啟動 controller,讓 c-jdbc 生效。
至於設定 cluster 的時候,必須要決定相關的架構設定,目前提供幾個 RAIDb (Redundant Array of Inexpensive Databases) 的型態。
RAIDb-0
{mosimage}
RAIDb-1
{mosimage}
RAIDb-2
{mosimage}
當你在不同情況之下,可能會有所不同的設計,也可以巢狀設計相關的資料庫 RAIDb 模式,這些都可以在 config 之下找到相關的範例,簡單的建議 模式 0,速度最快,但是資料遺失風險最高,模式 1 速度最慢,但是資料遺失風險最低,模式 2 則是取其二之優點,但是設計上會比較複雜。
最後,我們可以知道,利用 c-jdbc 真的很容易讓資料庫隱藏起來,並且幫我們達到 cluster 的功能。