來自J道Banq http://www.jdon.com/artichect/dbdead.htm


    現(xiàn)代軟件和以往傳統(tǒng)軟件主要區(qū)別在于:現(xiàn)代軟件基于internet互聯(lián)網(wǎng)技術,運行于開放的網(wǎng)絡環(huán)境,不象傳統(tǒng)軟件只是運行在封閉的局域網(wǎng),運行環(huán)境的區(qū)別就決定了軟件操作用戶的多少,在一個開放互聯(lián)網(wǎng)環(huán)境, 你的軟件系統(tǒng)用戶是不斷增長,特別是那些對所有人群開放的社區(qū)網(wǎng)站系統(tǒng),更是承受前所未有的訪問負載。那么,這些軟件系統(tǒng)承受的壓力主要會集中在軟件的哪個環(huán)節(jié)呢?如果你使用傳統(tǒng)軟件的設計思路,那么無疑壓力都集中在數(shù)據(jù)庫上。

隨著用戶的爆發(fā)量增長,在某個凌晨醒來時,你發(fā)現(xiàn):數(shù)據(jù)庫已死。

傳統(tǒng)軟件系統(tǒng)實則應該叫數(shù)據(jù)庫軟件系統(tǒng),是一個數(shù)據(jù)庫系統(tǒng),開發(fā)這樣的系統(tǒng)非常簡單,成本 也非常低廉,只要根據(jù)需求先設計好數(shù)據(jù)表結(jié)構,然后,就找一些大學畢業(yè)生寫大量SQL語句,雖然還使用 JAVA/PHP/.NET等語言,但實際上這些語言只是將SQL送往數(shù)據(jù)庫執(zhí)行的運輸工,沒有什么價值和地位。

所以,這樣的系統(tǒng)運行在互聯(lián)網(wǎng)環(huán)境下以后,主要負載就集中在數(shù)據(jù)庫的SQL運行上,也就是說:整個軟件系統(tǒng)性能關鍵點就集中在數(shù)據(jù)庫上了,數(shù)據(jù)庫是性能 主角,是王者;雖然你購置了昂貴的Websphere/weblogic等應用服務器,但是由于Java只是運輸工,根本起不到性能上負載分擔的作用。

著名的社區(qū)網(wǎng)站MySpace就是因為一個好的idea,用戶瘋狂增長,但是系統(tǒng)卻不能平滑承受增長的用戶訪問,這些用戶訪問網(wǎng)站緩慢、無法訪問甚至丟失數(shù)據(jù),他們經(jīng)過幾次傷筋動骨的架構升級,在微軟SQLServer直接技術支持下, 好容易才勉強應付過去。看看他們痛苦經(jīng)歷,你是否也愿意再來一次呢?詳細情況: http://www.jdon.com/jivejdon/thread/34601.html

從中可以看出,數(shù)據(jù)庫性能微調(diào)和挖潛總是有限度的,對數(shù)據(jù)庫性能優(yōu)化提高性能的步伐永遠趕不上用戶增長量, 有人也提出數(shù)據(jù)庫集群的概念,其實數(shù)據(jù)庫集群是一個騙人概念,一般只是備份,在集群數(shù)量和failover上有制約, 否則,數(shù)據(jù)庫巨頭Oracle不會跑到JavaEE陣營搖旗吶喊,還最早推出EJB3服務器,并揚言要收購JavaEE過去老大 Bea Weblogic。

很顯然,數(shù)據(jù)庫成已經(jīng)為軟件系統(tǒng)的主要性能瓶頸了,單純依靠數(shù)據(jù)庫自救的方式已經(jīng)行不通,是宣布數(shù)據(jù)庫退出主角時候了,那么由誰來宣布:教皇數(shù)據(jù)庫已死?無疑是Java。

Java社區(qū)早在本世紀初就提出中間件概念,用以取代數(shù)據(jù)庫地位,實則就是將軟件系統(tǒng)主要負載從數(shù)據(jù)庫上轉(zhuǎn)移到中間件服務器上,分擔負載。 也就是說:Java社區(qū)提出:既然數(shù)據(jù)庫已經(jīng)成為瓶頸,修修補補也無濟于事,不如放棄它,不再依賴它。

也就是說:Java不再做SQL的運輸工,不再是跑龍?zhí)椎牧耍侵鹘牵敲慈绾巫孞ava成為主角呢?那必須依賴對象這個概念,對象是生活在中間件服務器內(nèi)存中,它又是數(shù)據(jù)庫數(shù)據(jù)的業(yè)務封裝,它和數(shù)據(jù)庫有著 千絲萬縷的關系,但是它又和關系數(shù)據(jù)庫存在天然矛盾,兩者水火不容。

過去,我們是將業(yè)務邏輯寫成SQL送往數(shù)據(jù)庫執(zhí)行,導致數(shù)據(jù)庫成為業(yè)務邏輯主要運行瓶頸,那么,如果我們將 業(yè)務邏輯用對象概念表達,而不是SQL,那么我們的業(yè)務邏輯就圍繞內(nèi)存中的對象反復計算,這樣,負載不是集中在 對象運行的中間件服務器上(也就是應用服務器Weblogic/websphere/JBoss/Tomcat)?而對象/中間件都是用Java 語言表達的,無疑,這樣的架構,Java才成為主角。

再進一步想想:如果我們從軟件系統(tǒng)開始之初,就使用對象分析設計,不與數(shù)據(jù)庫沾邊,整個流程就完全OO,分析設計直至代碼都擺脫了數(shù)據(jù)庫影響,這個流程如下:

分析建模 細化設計(通過Evans DDD) 架構設計 代碼實現(xiàn) 調(diào)試測試 部署運行。

那么數(shù)據(jù)庫在什么時候建立呢?數(shù)據(jù)庫表結(jié)構的創(chuàng)建可以延緩到部署運行時,由Hibernate/EJB CMP/JPA等ORM技術自動實現(xiàn)。這樣, 整個上游環(huán)節(jié)就不涉及數(shù)據(jù)庫技術,而是使用更符合自然的表達OO方式,軟件質(zhì)量就更高了。我在J道網(wǎng)站已經(jīng)大量闡述了如何從OO分析 到OO實現(xiàn)的過程,包括我的Jdon框架也直接支持這樣一個自然方式。

現(xiàn)在,很多人已經(jīng)理解,分析設計要用OO,但是數(shù)據(jù)庫是運行階段缺少不了的,確實,這是正確觀點,我們奪取數(shù)據(jù)庫的王位,不是將它打倒,只是理性和平移交權力重心而已,數(shù)據(jù)庫退出主角地位,讓位于Java中間件,也預示著過去數(shù)據(jù)庫為王的時代的結(jié)束, 但是數(shù)據(jù)庫會和操作系統(tǒng)一樣,成為我們現(xiàn)代軟件系統(tǒng)一個不可缺少重要的基礎環(huán)節(jié)。

正是基于這樣事實,雖然我早在2005年喊出“數(shù)據(jù)庫時代的終結(jié)一文,回帖長達幾百貼, 大部分是懷疑論,不信論,其實2003年國外TSS就有一篇“給數(shù)據(jù)庫休息吧” (休息不代表退休,而是退居幕后,就象操作系統(tǒng)作用一樣),由此可見,由于傳統(tǒng)觀點影響和不及時與國際新思想同步,國內(nèi)數(shù)據(jù)庫保皇派還是有相當人數(shù)的。我 BanQ人微言輕,拋出這些觀點被保皇派譏諷為所瘋話,那么看看,著名ORM框架Hibernate和SEAM框架創(chuàng)始人Gavin King的一段觀點:

In almost all enterprise applications, the database is the primary bottleneck, and the least scalable tier of the runtime environment. 數(shù)據(jù)庫成為了大多數(shù)企業(yè)應用的主要瓶頸,也成為了運行環(huán)境中最不具伸縮性的層。... PHP/Ruby的用戶會說什么都不共享(share nothing)的架構照樣具有很好的伸縮性,.... 這些傻瓜真正想的是“除了數(shù)據(jù)庫以外什么都不共享(Share nothing except for the database)”的架構。更多參看這里

所謂伸縮性,就是彈性,整個軟件架構既支持小負載運行,也支持大負載支持,只要增加服務器即可; 由于軟件系統(tǒng)負載已經(jīng)從SQL轉(zhuǎn)移到內(nèi)存中的對象上,那么我們就可以通過增加這些應用服務器數(shù)量,通過分布式計算甚至云計算,達到業(yè)務對象在多臺應用服務 器之間傳遞共享,而不必通過數(shù)據(jù)庫這個環(huán)節(jié),既減輕數(shù)據(jù)庫負載,又能輕松擴充性能,不必走 集中試大型主機之路,只要添置低廉PC服務器即可。經(jīng)過權威測試:websphere/weblogic的20臺PC服務器集群性能不亞于一臺SUN/IBM的中型機,性價比已經(jīng)一目了然了。

JavaEE的服務器的集群相對于Linux等操作系統(tǒng)集群的好處在于:JavaEE集群能夠針對某個繁忙負載大的具體業(yè)務功能進行集群,換句話說: 就是做到精確制導,精確解決問題,而顯然,Linux操作系統(tǒng)的集群則無法直至業(yè)務核心的。

從另外一個方面看:雖然現(xiàn)在PHP號稱走上對象路線,Ruby的鐵軌開始鋪進企業(yè),但是他們的運行環(huán)境實則依賴數(shù)據(jù)庫的, 特別是Ruby On Rails還是最適合Evans DDD對象建模路線,但是目前來講還是"披著羊皮的狼",批著DDD,實則是以數(shù)據(jù)庫中心。當然相信 ROR等將來會提供分布式計算環(huán)境,但是JavaEE在2002年時就通過EJB以及分布式緩存成熟穩(wěn)定地提供分布式計算的中間件,并且已經(jīng)大量成熟應用。

本文結(jié)束以前,我相信大家明白,在眾多語言平臺競爭中,為什么Java能夠擊敗過去拳王數(shù)據(jù)庫,奪得新的拳王冠軍,以及他的特點所在。有人可能會說:你忘記談.NET了,這個不用我回答你,用微軟中國董事長張亞勤的話回答:8年前.NET戰(zhàn)略很天真, 你會將你的重要業(yè)務企業(yè)計算依賴一個很天真不成熟的技術嗎?除非你自己也很天真:)。