業(yè)界對(duì)持久存儲(chǔ)領(lǐng)域的追求從未停止過(guò),為了更方便、更容易地用對(duì)象表達(dá)我們的思維,開(kāi)源領(lǐng)域和商業(yè)領(lǐng)域都涌現(xiàn)了許多新技術(shù), ORM 的出現(xiàn)恰恰說(shuō)明了這點(diǎn)。最近一年,業(yè)界也在反思,到底 ORM 給我們帶來(lái)的是便利還是麻煩。矛頭指向大名鼎鼎的 Hibernate ,紛紛議論其性能問(wèn)題,大家似乎要達(dá)成這樣的共識(shí):“在業(yè)務(wù)邏輯復(fù)雜的地方用 SP ,而一般的 CRUD 還是 Hibernate ”,就連全球知名的 BearingPoint 也有類似看法。下面一個(gè)簡(jiǎn)單的例子,說(shuō)明了傳統(tǒng) ORM 工具的弊端。讓我們考慮一個(gè)簡(jiǎn)單的 Student 對(duì)象如清單1:
public class Student { private String name; private int age; public String getName(){ return name; } public int getAge(){ return age; } } |
考慮下面這個(gè)場(chǎng)景:找到“年齡小于 20 歲的所有學(xué)生”?
使用 ORL 實(shí)現(xiàn)如清單2:
String oql = "select * from student in AllStudents where student.age <20"; OQLQuery query = new OQLQuery(oql); Object students = query.execute(); |
使用 JDOQL 實(shí)現(xiàn)如清單3:
Query query = persistenceManager.newQuery(Student.class, "age <20"); Collection students = (Collection)query.execute(); |
上面的方法都存在一些普遍問(wèn)題:
- 現(xiàn)代集成開(kāi)發(fā)環(huán)境不會(huì)檢查內(nèi)嵌字符串的語(yǔ)義和語(yǔ)法錯(cuò)誤。在上面所有查詢語(yǔ)句中, age 字段和數(shù)值 20 都被認(rèn)為是數(shù)字類型,但是沒(méi)有一個(gè) IDE 或編譯器能檢查其實(shí)際正確性。如果開(kāi)發(fā)者混淆了查詢代碼-―比如,改變了 age 字段的名字或類型,將導(dǎo)致――上面所有的查詢語(yǔ)句在運(yùn)行時(shí)報(bào)錯(cuò),而不會(huì)在編譯時(shí)提示。
- 現(xiàn)代敏捷開(kāi)發(fā)技術(shù)鼓勵(lì)不斷進(jìn)行重構(gòu)來(lái)維持清晰和與時(shí)俱進(jìn)的類模型,以便準(zhǔn)確重現(xiàn)不斷演進(jìn)的域模型。如果查詢代碼難于維護(hù),它會(huì)延遲決定重構(gòu)的時(shí)間并不可避免的引入低質(zhì)量代碼。
- 所有列出的查詢都直接用 Student 類的私有成員 age,而不是使用它的公共接口 student.getAge(),因此他們都破壞了面向?qū)ο蠓庋b規(guī)則,違反接口和實(shí)現(xiàn)應(yīng)該分離的面向?qū)ο蠓▌t。
- 所有的查詢都非 100% 的原生。
既然存在如此多的問(wèn)題, 為什么不直接使用純面向?qū)ο髷?shù)據(jù)庫(kù)呢?有些開(kāi)發(fā)者可能會(huì)說(shuō):“它缺乏數(shù)學(xué)模型的支持, 還不夠成熟”。的確, RDBMS 發(fā)展了幾十年才有今天的成就,已經(jīng)非常完善了。而技術(shù)的革新是無(wú)止境的, 故步自封的永遠(yuǎn)都跟不上變化的腳步。
讓我們來(lái)簡(jiǎn)單回顧一下對(duì)象數(shù)據(jù)庫(kù)的發(fā)展史(資料來(lái)源于 Wiki 百科全書(shū)):“面向?qū)ο髷?shù)據(jù)庫(kù)系統(tǒng)”這一術(shù)語(yǔ)第一次出現(xiàn)于 1985 年。著名的研究項(xiàng)目包括:Encore-Ob/Server ( 布朗大學(xué)), EXODUS(Wisconsin 大學(xué)), IRIS (惠普), ODE ( Bell 實(shí)驗(yàn)室), ORION (MCC ) ,Vodak (GMD-IPSI)和 Zeitgeist (Texas Instruments)。其中以 ORION 項(xiàng)目發(fā)表的論文數(shù)為最多。 MCC 的 Won Kim 將這些論文中最有價(jià)值的一部分匯編成書(shū)并由 MIT 出版社出版。對(duì)象數(shù)據(jù)庫(kù)管理系統(tǒng)為面向?qū)ο缶幊陶Z(yǔ)言增加了持久的概念。最早的商品化 ODBMS 出現(xiàn)在 1986 年,是 Servio 公司(現(xiàn)在的 GemStone 公司)和 Ontos 公司推出的。后來(lái)(九十年代) Object Design ( ODI )、 Versant 、 Objectivity 、 O2 Technology 、 Poet 、 Ibex 、 UniSQL 和 ADB MATISSE 等公司也加入了這個(gè)開(kāi)拓行列。
而今天,一家來(lái)自加州硅谷的開(kāi)源面向?qū)ο髷?shù)據(jù)庫(kù)公司 db4objects 為我們帶來(lái)了db4o, 一款性能卓越的純面向?qū)ο髷?shù)據(jù)庫(kù),也是我們這篇和后續(xù)文章將會(huì)介紹的主角。
db4o 為我們帶來(lái)的是這樣一種面向?qū)ο蟮牟樵兎绞?
- 100% 的原生 查詢語(yǔ)言應(yīng)能用實(shí)現(xiàn)語(yǔ)言( Java 或 C# )完全表達(dá),并完全遵循實(shí)現(xiàn)語(yǔ)言的語(yǔ)義。
- 100% 的面向?qū)ο?/b> 查詢語(yǔ)言應(yīng)可運(yùn)行在自己的實(shí)現(xiàn)語(yǔ)言中,允許未經(jīng)優(yōu)化執(zhí)行普通集合而不用自定義預(yù)處理。
- 100% 的類型安全 查詢語(yǔ)言應(yīng)能完全獲取現(xiàn)代 IDE 的特性,比如語(yǔ)法檢測(cè)、類型檢測(cè)、重構(gòu),等等。
![]() ![]() |
![]()
|
“利用表格存儲(chǔ)對(duì)象,就像是將汽車(chē)開(kāi)回家,然后拆成零件放進(jìn)車(chē)庫(kù)里,早晨可以再把汽車(chē)裝配起來(lái)。但是人們不禁要問(wèn),這是不是泊車(chē)的最有效的方法呢。” – Esther Dyson
db4o 是一個(gè)開(kāi)源的純面向?qū)ο髷?shù)據(jù)庫(kù)引擎,對(duì)于 Java 與 .NET 開(kāi)發(fā)者來(lái)說(shuō)都是一個(gè)簡(jiǎn)單易用的對(duì)象持久化工具,使用簡(jiǎn)單。同時(shí),db4o 已經(jīng)被第三方驗(yàn)證為具有優(yōu)秀性能的面向?qū)ο髷?shù)據(jù)庫(kù), 下面的基準(zhǔn)測(cè)試圖對(duì) db4o 和一些傳統(tǒng)的持久方案進(jìn)行了比較。db4o 在這次比較中排名第二,僅僅落后于JDBC。通過(guò)圖 1 的基準(zhǔn)測(cè)試結(jié)果,值得我們細(xì)細(xì)品味的是采用 Hibernate/HSQLDB 的方案和 JDBC/HSQLDB 的方案在性能方面有著顯著差距,這也證實(shí)了業(yè)界對(duì) Hibernate 的擔(dān)憂。而 db4o 的優(yōu)異性能,讓我們相信: 更 OO 并不一定會(huì)犧牲性能。
同時(shí),db4o 的一個(gè)特點(diǎn)就是無(wú)需 DBA 的管理,占用資源很小,這很適合嵌入式應(yīng)用以及 Cache 應(yīng)用, 所以自從 db4o 發(fā)布以來(lái),迅速吸引了大批用戶將 db4o 用于各種各樣的嵌入式系統(tǒng),包括流動(dòng)軟件、醫(yī)療設(shè)備和實(shí)時(shí)控制系統(tǒng)。
db4o 由來(lái)自加州硅谷的開(kāi)源數(shù)據(jù)庫(kù)公司 db4objects 開(kāi)發(fā)并負(fù)責(zé)商業(yè)運(yùn)營(yíng)和支持。db4o 是基于 GPL 協(xié)議。db4objects 于 2004 年在 CEO Christof Wittig 的領(lǐng)導(dǎo)下組成,資金背景包括 Mark Leslie 、 Veritas 軟件公司 CEO 、 Vinod Khosla ( Sun 公司創(chuàng)始人之一)、 Sun 公司 CEO 在內(nèi)的硅谷高層投資人組成。毫無(wú)疑問(wèn),今天 db4objects 公司是硅谷炙手可熱的技術(shù)創(chuàng)新者之一。
![]() |
![]()
|
db4o 的目標(biāo)是提供一個(gè)功能強(qiáng)大的,適合嵌入的數(shù)據(jù)庫(kù)引擎,可以工作在設(shè)備,移動(dòng)產(chǎn)品,桌面以及服務(wù)器等各種平臺(tái)。主要特性如下:
- 開(kāi)源模式。與其他 ODBMS 不同,db4o 為開(kāi)源軟件,通過(guò)開(kāi)源社區(qū)的力量驅(qū)動(dòng)開(kāi)發(fā) db4o 產(chǎn)品。
- 原生數(shù)據(jù)庫(kù)。db4o 是 100% 原生的面向?qū)ο髷?shù)據(jù)庫(kù),直接使用編程語(yǔ)言來(lái)操作數(shù)據(jù)庫(kù)。程序員無(wú)需進(jìn)行 OR 映射來(lái)存儲(chǔ)對(duì)象,大大節(jié)省了程序員在存儲(chǔ)數(shù)據(jù)的開(kāi)發(fā)時(shí)間。
-
高性能。
圖2
為 db4o 官方公布的基準(zhǔn)測(cè)試數(shù)據(jù),db4o 比采用 Hibernate/MySQL 方案在某些測(cè)試線路上速度高出 44 倍之多!并且安裝簡(jiǎn)單,僅僅需要 400Kb 左右的 .jar 或 .dll 庫(kù)文件。在接下來(lái)的系列文章中,我們將只關(guān)注在 Java 平臺(tái)的應(yīng)用,但是實(shí)際上 db4o 毫無(wú)疑問(wèn)會(huì)很好地在 .NET 平臺(tái)工作。
圖2. db4o 官方基準(zhǔn)測(cè)試數(shù)據(jù) - 易嵌入。使用 db4o 僅需引入 400 多 k 的 jar 文件或是 dll 文件,內(nèi)存消耗極小。
- 零管理。使用 db4o 無(wú)需 DBA,實(shí)現(xiàn)零管理。
- 支持多種平臺(tái)。db4o 支持從 Java 1.1 到 Java 5.0,此外還支持 .NET 、 CompactFramework 、 Mono 等 .NET 平臺(tái),也可以運(yùn)行在 CDC 、 PersonalProfile 、 Symbian 、 Savaje 以及 Zaurus 這種支持反射的 J2ME 方言環(huán)境中,還可以運(yùn)行在 CLDC 、 MIDP 、 RIM/Blackberry 、 Palm OS 這種不支持反射的 J2ME 環(huán)境中。
或許開(kāi)發(fā)者會(huì)問(wèn),如果現(xiàn)有的應(yīng)用環(huán)境已經(jīng)有了關(guān)系型數(shù)據(jù)庫(kù)怎么辦?沒(méi)關(guān)系,db4o 的 dRS(db4o Replication System)可實(shí)現(xiàn) db4o 與關(guān)系型數(shù)據(jù)庫(kù)的雙向同步(復(fù)制),如圖 3 。 dRS 是基于 Hibernate 開(kāi)發(fā),目前的版本是 1.0 ,并運(yùn)行在 Java 1.2 或更高版本平臺(tái)上,基于 dRS 可實(shí)現(xiàn) db4o 到 Hibernate/RDBMS 、 db4o 到 db4o 以及 Hibernate/RDBMS 到 Hibernate/RDBMS 的雙向復(fù)制。dRS 模型如圖3
![]() |
![]()
|
db4o 因?yàn)槠溟_(kāi)源的理念,以及創(chuàng)新的實(shí)現(xiàn),獲得了 Java Pro 2006 讀者選擇獎(jiǎng)。無(wú)論從成功案例還是 db4o 本身來(lái)看,這款純面向?qū)ο髷?shù)據(jù)庫(kù)都值得我們關(guān)注,從官方論壇反饋情況看,有相當(dāng)?shù)挠脩魷?zhǔn)備把關(guān)系型數(shù)據(jù)庫(kù)遷移到 db4o 。而最新發(fā)布的 5.5 版本,更是把性能再次提升很多。在接下來(lái)的文章中,我會(huì)繼續(xù)和大家分享 db4o 給我們帶來(lái)的這場(chǎng)面向?qū)ο髷?shù)據(jù)庫(kù)風(fēng)暴。
?
學(xué)習(xí)
- db4o 官方網(wǎng)站: http://www.db4o.com 。
- ODMG 官方網(wǎng)站 http://www.odmg.org 了解 ODMG 技術(shù)
討論
- db4o 開(kāi)發(fā)者論壇:http://developer.db4o.com/forums/ 討論 db4o 技術(shù)。
- db4o 中國(guó)開(kāi)發(fā)者論壇:http://developer.db4o.com/forums/10/ShowForum.aspx 討論 db4o 技術(shù)。
- developerWorks java 論壇 http://www.ibm.com/developerworks/forums/dw_forum.jsp?S_TACT=105AGX52&cat=10&S_CMP=cn-a-j&forum=181 學(xué)習(xí) Java 技術(shù)。
|
![]() |
Rosen Jiang 來(lái)自成都,是 db4o 和 OO 的忠實(shí) fans,是 2005 年 db4o 的 dvp 獲得者之一。他正在 J2me 應(yīng)用中使用 db4o,你可以通過(guò) rosener_722@hotmail.com 和他聯(lián)系。 |
![]() |
||
|
![]() |
張黃矚,熱愛(ài)開(kāi)源軟件,熟悉 Java/C/C++ 編程語(yǔ)言,對(duì)數(shù)據(jù)庫(kù)技術(shù)網(wǎng)絡(luò)技術(shù)均感興趣。你可以通過(guò) zhanghuangzhu@gmail.com 聯(lián)系他。 |
![]() |
||
|
![]() |
Chris 來(lái)自香港,熱愛(ài)開(kāi)源和 db4o。他創(chuàng)辦了中國(guó)最火熱的 Java 和開(kāi)源社區(qū) Matrix(http://www.Matrix.org.cn), 你可以通過(guò) chris@Matrix.org.cn 和他聯(lián)系。 |
IBM DeveloperWorks(IBM DW) 版權(quán)所有!引用、轉(zhuǎn)貼本文應(yīng)注明本文來(lái)自 IBM DW。