在那些開口閉口就是多少TPS(Transaction per Second)的系統裡,Oracle TimesTen記憶體資料庫與BEA的Weblogic RealTime算是兩支奇兵。
一、Oracle TimesTen
Oracle TimesTen是Oracle收購的一款記憶體資料庫。Oracle的SQL無論如何打生打死的最佳化,始終逃不開兩個效能的瓶頸:
1.讀取硬碟。
雖然大家一般都開了幾G記憶體作緩衝,但你畢竟不能編程式控制制把哪些資料載入緩衝,更重要是資料庫的基本演算法設計是按讀取硬碟為前提。而記憶體資料庫是天生就完全基於記憶體的。
2. C/S模式的處理序間通訊。
無論是管道,本地Socket還是遠程Socket形式的處理序間通訊(IPC),效能消耗都不能無視,所以我們經常要注意資料庫互動的往返次數。而TimesTen直接開在共用記憶體中,Client通過Driver直接讀取共用記憶體,快呀。
以上兩點天然優勢是眾多記憶體資料庫都擁有的,如做了好多電信生意的Altibase,如ExtremeDB,但Oracle TimesTen好在被Oracle收購了,與Oracle能夠很好的互聯。
記憶體資料庫可以將自己持久化到硬碟檔案,但在很多情境中,它只負責部分資料的讀緩衝,實際的整體業務資料仍在統一的大資料庫裡。這時候TimesTen就顯示出無比的社會主義優越性:
1. 啟動時快速的從Oracle載入部分表的部分資料(用SQL配置)到TimesTen,速度比自己用程式手工查詢再放入記憶體資料庫要快得多。
2. 當Oracle的資料發生變化,會自動增量同步處理到TimesTen,這個解放了好多生產力阿。以往處理同步只有兩條路子走:
一是業務系統在更改資料的同時發送JMS訊息,由負責維護記憶體資料庫的進程偵聽這條訊息。
二是利用Oracle SQLJ功能,設Trigger調度由Java寫的預存程序,將變動的訊息發出去。
二、Weblogic Real Time Core Edition
Weblogic 提供即時環境所要求的快速、可預測的回應時間與無暫停應用平台,benchmark 應用最多隻有30ms的延遲。
所謂即時其實分兩種
1:硬即時:定義了一個系統,其中所有可調度和不可調度的實體的執行都要遵守規定的完成時間約束。其它時間約束(也稱為“上界”)可能也必須滿足。實體的行為和已耗用時間是可預測的、確定的。
2:軟即時:表示不屬於硬即時的所有其它即時情況。所有時間約束都是軟性的。基本上,這就意味著所有可調度和不可調度的實體都可能被最佳化以便以最佳狀態執行,但是執行時間不可預測。
WLRT明顯屬於軟即時,它由幾個部分組成:
1. Weblogic Express Basic
A webserver with JDBC, JSP, Servlets, and RMI, but not EJB, JCA, JMS, or XA Transactions。
2. JRocket
使用確定性垃圾收集(DetGC)的高效能JVM。DetGC是整個WLRT的核心賣點。垃圾收集對Java效能有著很大的影響。在full垃圾收集期間,Java進程會完全停止。確定性垃圾收集避免了其他虛擬機器中無法預測的暫停時間,從而支援最短的事務延遲。
3. Weblogic Spring Framework
不要笑啊,就是Spring了,使用POJO作為EJB的替代方案。配合Weblogic Basic Express,不知道Tomcat+Spring與它的差距有多大。
另外,看這篇WebLogic Real Time 1.0“Trader”應用程式效能分析http://dev2dev.bea.com.cn/techdoc/20060620820.html,可以看到金融即時系統裡全用JMS,而不是Corba,EJB或者Web Service,即使是Request/Response的形式,而不是那種典型的非同步呼叫,照樣JMS不誤。其中詢價這種操作還取消了持久化訊息的步驟。