網(wǎng)上關(guān)于JDO的文章已經(jīng)不少了,關(guān)于JDO的優(yōu)點(diǎn)也講了很多,我看了一些文章后,自己也研究了一段時間,忽然很想寫一個系列文章全面的介紹一下JDO,今天先寫下第一篇算是個開頭。呵呵,有些內(nèi)容是我對JDO規(guī)范的理解,如果有不對的地方請大家指正。
Java開發(fā)人員已經(jīng)有好幾種存取數(shù)據(jù)庫的方法:序列化,JDBC,面向?qū)ο笥成涔ぞ撸瑢ο髷?shù)據(jù)庫,以及實(shí)體EJB。那為什么還要介紹其他的存儲架構(gòu)呢?答案是,上面每一種實(shí)現(xiàn)存儲的方案都存在一定的限制。JDO正在嘗試解決這些限制。
序列化 是Java建立的一種傳輸機(jī)制,它能夠把對象的信息轉(zhuǎn)換成一系列的字節(jié)碼,這些字節(jié)碼可以可以被傳輸?shù)骄W(wǎng)絡(luò)或者存儲到一個文件中。序列化的使用非常簡單,但他還是有限制的。它必須立即存取對象的特征,而且它不適合存取大批量的數(shù)據(jù)。在它更改一個對象的屬性時如果有錯誤發(fā)生他不能回滾錯誤的修改,因此不適于應(yīng)用程序的數(shù)據(jù)完整性要求。多個線程或程序不能同時互不干擾的讀寫序列化數(shù)據(jù)。所有這些不足是的序列化無法滿足大多數(shù)數(shù)據(jù)存儲要求。
許多程序員使用 JDBC API來操作關(guān)系數(shù)據(jù)庫。JDBC克服了許多序列化中存在的缺點(diǎn):它可以操作大批量的數(shù)據(jù),有確保數(shù)據(jù)一致性的機(jī)制,支持信息的并發(fā)存取,可以使用已經(jīng)非常成熟的SQL語言。不幸的是,JDBC使用起來并不像序列化那么簡單。JDBC使用的關(guān)系范例不是被設(shè)計用于存儲對象的,因此,它迫使你放棄代碼中使用面向?qū)ο蟪绦虼鎯?shù)據(jù)的可能。
由軟件廠商創(chuàng)建的架構(gòu)可以為你實(shí)現(xiàn)對象和關(guān)系數(shù)據(jù)庫之間的映射。 這種對象-關(guān)系映射支持可以是的你專注于對象模型的設(shè)計而不必關(guān)心面向?qū)ο蠛完P(guān)系數(shù)據(jù)庫之間的匹配。不幸的是每一種對象-關(guān)系映射支持都有一套他自己廠商實(shí)現(xiàn)的API。你不得不使自己的代碼遷就某一個單獨(dú)廠商的實(shí)現(xiàn)。假如這個廠商提高價格或者停止對bug更改的支持,如果你想用其他的廠商實(shí)現(xiàn)架構(gòu)時,你就不得不重寫你的代碼。
比對象關(guān)系數(shù)據(jù)庫映射更好的是,一些軟件廠商開發(fā)了一種新的存儲對象到數(shù)據(jù)庫的方法。這種對象數(shù)據(jù)庫使用起來常常比對象關(guān)系映射軟件簡單。ODMG組織成立的目的就是創(chuàng)建一個訪問對象數(shù)據(jù)庫的標(biāo)準(zhǔn)API。一些廠商也尊崇ODMG組織的要求,因此由于廠商實(shí)現(xiàn)不同帶來的麻煩也解決了。一些公司對于從關(guān)系數(shù)據(jù)庫轉(zhuǎn)向?qū)ο髷?shù)據(jù)庫顯得猶豫不決,因?yàn)橛写罅康臄?shù)據(jù)存儲在傳統(tǒng)的關(guān)系數(shù)據(jù)庫中。個別數(shù)據(jù)庫分析工具可以用于對象數(shù)據(jù)庫,然而大量的數(shù)據(jù)存儲使用的仍然是關(guān)系數(shù)據(jù)庫。由于這些原因,對象數(shù)據(jù)庫被很好的利用。
Java平臺的企業(yè)級應(yīng)用中引入了實(shí)體EJB。 實(shí)體EJB是一個組件,他描述了數(shù)據(jù)庫中的持久性數(shù)據(jù)信息。EJB使用類似于“對象-關(guān)系”映射的辦法,它提供了一個持久性數(shù)據(jù)的面向?qū)ο蟮谋硎尽2煌趯ο箨P(guān)系軟件,EJB對于關(guān)系數(shù)據(jù)庫沒有限制;它描述的持久性信息可以來自一個企業(yè)信息系統(tǒng)(EIS)或者其他的存儲設(shè)備。而且,EJB使用了一個嚴(yán)格標(biāo)準(zhǔn),實(shí)現(xiàn)它的廠商必須遵循這個標(biāo)準(zhǔn)。不幸的是,EJB標(biāo)準(zhǔn)在面向?qū)ο蠓矫嫔晕⒂行┣啡保热缫恍└呒壍奶匦裕豪^承、多態(tài)和復(fù)合關(guān)系等。另外,EJB的代碼編寫很復(fù)雜,而且它是一個重量級組建需要消耗應(yīng)用服務(wù)器很很多的資源來運(yùn)行。但是,EJB中的會話Bean和消息驅(qū)動Bean有很多優(yōu)勢,所以JDO規(guī)范詳細(xì)定義了JDO如何與他們進(jìn)行集成。
JDO集成了很多上述持久性機(jī)制的特性,這使得在JDO中創(chuàng)建一個持久類就像創(chuàng)建一個序列化類一樣簡單。JDO還支持批量數(shù)據(jù)的存儲,數(shù)據(jù)一致性,并發(fā)處理和JDBC的查詢功能。就像“對象-關(guān)系”映射軟件和對象數(shù)據(jù)庫一樣,它允許使用面向?qū)ο蟮母呒壐拍睿热?#8220;繼承”。它避免了像EJB中實(shí)體Bean一樣必須依賴于來自廠商定義的嚴(yán)格規(guī)范的限制。像EJB一樣,JDO也不限定任何特定的后端數(shù)據(jù)庫。
但是,這里還是要說一下,世界上從來就沒有“萬靈丹”。所以,JDO并不是對于每一個應(yīng)用程序都是有好處的。很多應(yīng)用程序完全可以使用其他更理想的存儲機(jī)制。