国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

使用Java Data Object(JDO)存放持久性數(shù)據(jù)

2019-11-18 15:14:01
字體:
供稿:網(wǎng)友

  了解一個良好數(shù)據(jù)層的應(yīng)有的特質(zhì)
java Data Object(JDO) 標準提供了一個統(tǒng)一的、簡單的、在Java application object和數(shù)據(jù)庫間透明的接口,它是數(shù)據(jù)處理的一個革新,在本文中作者將會討論我們所碰到的持久性數(shù)據(jù)的處理、特性等問題,最后介紹JDO這種解決方案

數(shù)據(jù)和計算一樣古老,現(xiàn)在隨著面對對象語言的興起,面向?qū)ο蟮臄?shù)據(jù)也變得深入人心起來。目前大多數(shù)先進的、重要的應(yīng)用程序都使用面向?qū)ο蟮臄?shù)據(jù)結(jié)構(gòu)。另一方面 大部分的數(shù)據(jù)庫系統(tǒng)仍然是關(guān)系型數(shù)據(jù)庫,雖然面向?qū)ο蟮臄?shù)據(jù)結(jié)構(gòu)對很多應(yīng)用必不可少,但我們能仍然要考慮很多原有系統(tǒng)的需要

本文討論的是在傳統(tǒng)中間件環(huán)境下,比如J2EE中,JDO是如何解決持久性數(shù)據(jù)的問題。本篇文章是一篇有關(guān)JDO的介紹,而并非具體的教程,面向的是應(yīng)用程序的開發(fā)者(熟悉Java開發(fā)、對象數(shù)據(jù)庫和關(guān)系型數(shù)據(jù)庫),而不是JDO的實現(xiàn)設(shè)計人員

需要透明的存儲層?
以下列舉了為什么我們使用面向?qū)ο蟮臄?shù)據(jù):

1.拋開數(shù)據(jù)存儲的細節(jié),建立簡單、明了的面向?qū)ο蟮腁PI來處理數(shù)據(jù)。我們不關(guān)心存儲的細節(jié)和數(shù)據(jù)庫中內(nèi)部的數(shù)據(jù)含義,而是關(guān)心數(shù)據(jù)間的關(guān)系、對象含義或其他的一些邏輯。為什么我們要處理數(shù)據(jù)存儲中的低級結(jié)構(gòu),比如表、列,并來往返回的存取他們,我需要的是更關(guān)注復(fù)雜邏輯應(yīng)用中所直接所應(yīng)用的數(shù)據(jù)形式

2.我們想要使用即插即用的方式來處理數(shù)據(jù):當改變數(shù)據(jù)庫時不需要更改一行代碼,甚至也不要修改很多的配置。換句話說,我們需要一個以Java object為基礎(chǔ)來存取數(shù)據(jù)的工業(yè)標準,就如同象JDBC那樣是訪問SQL數(shù)據(jù)的工業(yè)標準.

3.我們需要即插即用的方式來處理不同的數(shù)據(jù)視圖,也就是說我們可以以最小的改動完成從關(guān)系型數(shù)據(jù)庫向面向?qū)ο髷?shù)據(jù)庫的的轉(zhuǎn)變。聽起來不錯,但在實際使用使用中,這并不重要。

以上的3個原因需要我們定義一個存儲框架來提供對象和關(guān)系型數(shù)據(jù)庫之間高級別的Java API,這些API的生命周期要長于運行環(huán)境(JVM)的生命周期,這樣的API應(yīng)該具備以下的特征:

簡易

最少的嵌入

透明,意思是該框架需要隱藏數(shù)據(jù)庫實現(xiàn)

協(xié)調(diào)一致,簡單的API用于保存、取出、更新

支持事務(wù),需要定義出于數(shù)據(jù)對象的相應(yīng)事務(wù)語義

既支持可治理(服務(wù)模式應(yīng)用),也支持非可治理(單機)的環(huán)境

支持必要的附加功能,比如緩沖、查詢、主鍵生成器、Map工具

下面,我們來詳述這些特征

簡易性
簡易性之所以被我放在一個這么高的位置,是因為,對開發(fā)分布式應(yīng)用來說已經(jīng)很復(fù)雜了,很多軟件項目的失敗正是由于它們過于復(fù)雜的治理方式。簡單不意味著過分簡化。只要能滿足開發(fā)者的工作就可以了

最少的嵌入
每個存儲系統(tǒng)總是會嵌入一定的內(nèi)容到程序代碼中,良好的數(shù)據(jù)層應(yīng)該最小化這種嵌入,從而提高可移植性

我這里指出的是嵌入是指:

所有需要嵌入程序中的有關(guān)存取相關(guān)的代碼(實現(xiàn)一些存取接口或類似存取的操作),這種嵌入的情況同時也出現(xiàn)一些ODBMS中(object-oriented database systems),相比RDBMS它會少一些,嵌入的多少和不同ODBMS實現(xiàn)商的實現(xiàn)有關(guān)

透明性
數(shù)據(jù)存儲層的透明性概念很簡單:所有的應(yīng)用程序使用與數(shù)據(jù)庫類型無關(guān)(數(shù)據(jù)庫類型透明性)、數(shù)據(jù)庫提供商無關(guān)(提供商透明性)的統(tǒng)一API。這種特性通過隱藏數(shù)據(jù)庫實現(xiàn)細節(jié)大大提高了代碼的可維護性和擴展性.比如對操作那些流行的關(guān)系型數(shù)據(jù)庫,可以不像JDBC那樣編寫繁雜的SQL語句并記住列的順序.事實上你都不需要了解SQL或任何關(guān)系型概念,因為它們都太與數(shù)據(jù)庫的實現(xiàn)相關(guān)了,透明性或許是數(shù)據(jù)層最重要的特性了

統(tǒng)一的、簡潔的API
數(shù)據(jù)存儲層API可以歸納為以下的一系列操作

作用于基礎(chǔ)類(first-class objects:String,Integer 等)的基本CRUD(create, read,
update, delete)操作

事務(wù)治理

應(yīng)用程序?qū)ο蠛蛿?shù)據(jù)對象同一性控制

緩沖治理(比如刷新和釋放治理)

查詢的創(chuàng)建和執(zhí)行

下面看一個數(shù)據(jù)層的API的例子:

public void persist(Object obj); // Save obj to the data store.
public Object load(Class c, Object pK); // Read obj with a given PRimary key.
public void update(Object obj); // Update the modified object obj.
public void delete(Object obj); // Delete obj from the database.

public Collection find(Query q); // Find objects that satisfy conditions of our query.

支持事務(wù)

一個良好的數(shù)據(jù)層需要一些基本的事務(wù)功能:開始、提交、回滾事務(wù)(start, commit,roll back),這里有一個例子:

// Transaction (tx) demarcation.

public void startTx();
public void commitTx();
public void rollbackTx();

// Choose to make a persistent object transient after all.

public void makeTransient(Object o)

注重:這樣的事務(wù)功能劃分只應(yīng)用在非治理環(huán)境(nonmanaged environments,單機),對可治理環(huán)境,內(nèi)建的事務(wù)的治理器通常已經(jīng)具備了這些功能

可治理環(huán)境,例如一個J2EE應(yīng)用服務(wù)器,數(shù)據(jù)層都會和這些應(yīng)用服務(wù)器的EJB容器和其他一些相應(yīng)的服務(wù)(比如JNDI和事務(wù)治理器),協(xié)同工作

查詢
這樣的API還必須具備數(shù)據(jù)的查詢能力,它應(yīng)該是穩(wěn)定、有效、易用的。這樣的API使用Java object 而不是SQL 表或其他的傳統(tǒng)數(shù)據(jù)表示參數(shù)作為自己的行為語言

緩沖治理
緩沖治理主要關(guān)系到應(yīng)用的性能,一個完善的數(shù)據(jù)層應(yīng)該提供完整的緩沖功能API,比如鎖定級別(locking levels:行鎖,整表鎖,列鎖)、延遲加載(lazy loading:指一開始數(shù)據(jù)不被加載,在第一次需要時,才加載)、緩沖清除策略(eviction policies: 指如何將過期數(shù)據(jù)從cache中clean掉,或?qū)懟卮疟P的策略)
譯者注:以上的3點也就是講述緩沖如何更新數(shù)據(jù)、如何加載數(shù)據(jù),如何把不用的數(shù)據(jù)從cache中移走

主鍵生成器
產(chǎn)生標注數(shù)據(jù)的唯一性標識是一個很普遍的功能,每個數(shù)據(jù)層都會提供一個擁有各種算法的主鍵生成器,有關(guān)主鍵的生成已經(jīng)是一個研究很成熟的問題,有很多主鍵生成的算法

Mapping(映射),對關(guān)系型數(shù)據(jù)庫而言
使用關(guān)系型數(shù)據(jù)庫,會有數(shù)據(jù)映射的問題:需要把對象映射成表、映射關(guān)系(比如對依靠和引用要映射成表或字段的關(guān)聯(lián)。這點對復(fù)雜的對象模型尤為重要.有關(guān)對象-關(guān)系的模型已經(jīng)超出了本文的范圍,但它很重要,請參考文尾的有關(guān)資料

如下的一些附加功能不是數(shù)據(jù)層所必須的,但他們會簡化開發(fā)員的一些工作:

圖形的映射工具

代碼生成器:自動生成DDL(data description
language)來創(chuàng)建數(shù)據(jù)庫表或根據(jù)DDL產(chǎn)生相應(yīng)的Java代碼和映射文件

主鍵生成器:支持多算法比如:UUID, HIGH-LOW, 和 SEQUENCE

支持二進制大字段對象(BLOBs)和文本型大字段對象(CLOBs)

自我引用關(guān)系:比如一個Bar對象引用另一個Bar對象

支持原始sql語句 :傳遞SQL查詢

范例
下面的例子將會顯示如何使用數(shù)據(jù)層的API,加設(shè)下面一種情況:一個公司有一個或多個位置,每個位置有一個或多個用戶,這樣我們來看如下的程序代碼:

PersistenceManager pm =PMFactory.initialize(..);
Company co = new Company("MyCompany");
Location l1 = new Location1 ("Boston");
Location l2 = new Location("New York");

// Create users.

User u1 = new User("Mark");
User u2 = new User("Tom");
User u3 = new User("Mary");

// Add users. A user can only "belong" to one location.

L1.addUser(u1);
L1.addUser(u2);
L2.addUser(u3);

// Add locations to the company.

co.addLocation(l1);
co.addLocation(l2);

// And finally, store the whole tree to the database.

pm.persist(c);

另一種情況,你可以這樣查詢雇員Tom:

PersistenceManager pm =PMFactory.initialize(...)
Collection companiesEmployingToms = pm.find("company.location.user.name = ´Tom´");

對于關(guān)系型數(shù)據(jù)庫,你必須創(chuàng)建一個mapping文件,如下

<!DOCTYPE mapping PUBLIC ... >
<mapping>

<class name="com.numatica.example.Company" identity="companyID" key-generator="SEQUENCE">

<cache-type type="count-limited" capacity="5"/>

<description>Company</description>
<map-to table="Companies"/>

<field name="companyID"type="long">
<sql name="companyID" type="numeric"/>
</field>

<field name="name" type="string">
<sql name="name" type="varchar"/>
</field>

<field name="locations" type="com.numatica.example.Location" collection="arraylist">
</field>

</class>

<class name="com.numatica.example.Location "identity="locationID"
key-generator="SEQUENCE">
<cache-type type="unlimited"/>

<description>Locations</description>
<map-to table="Locations"/>

<field name="locationID" type="long">
<sql name="locationID" type="numeric"/>
</field>

<field name="name" type="string">
<sql name="name" type="varchar"/>
</field>

<field name="company" type="com.numatica.example.Company"required="true">
<sql name="companyID"/>
</field>

</class>

<class name="com.numatica.example.User" identity="userID"
depends="com.numatica.example.Location" >
<cache-type type="count-limited" capacity="200"/>

<description>User</description>
<map-to table="Users"/>

<field name="userID" type="integer">
<sql name="userID" type="numeric"/>
</field>

<field name="location" type="com.numatica.example.Location"required="true">
<sql name="locationID"/>
</field>

<field name="name" type="string">
<sql name="username" type="varchar"/>
</field>
</class>
</mapping>

持久數(shù)據(jù)層的工作圍繞著以下這些方面:

查找相關(guān)對象的組

保持應(yīng)用對象的一致性

治理數(shù)據(jù)的標識(主鍵)

按一定的順序儲存每一對象

提供緩沖治理

提供合適的事務(wù)范圍(我們不想只把對象樹的一部分存儲起來)

提供用戶可選的鎖定模式

一般有以下幾種解決方案

1.使用JDBC API,自己完成其它的工作

2.使用適合的對象-關(guān)系映射工具或者直接使用對象數(shù)據(jù)庫(ODBMS)

3.使用J2EE中的CMP-EJB(container-managed persistence entity bean)解決方案

4.Java Data Objects (JDO)解決方案

目前還沒有一種解決方案對所有的需求都可以適合,所以在我們主要介紹JDO之前,我們先瀏覽一下其他的幾種方案

自己編寫中間層代碼接口
過去,大部分開發(fā)人員使用關(guān)系型數(shù)據(jù)庫作數(shù)據(jù)存儲,自己開發(fā)數(shù)據(jù)的連接層應(yīng)用.這通常離不開2種技術(shù)JDBC和SQLJ,后者可能應(yīng)用少一些,它們都需要應(yīng)用一些SQL技術(shù),并且這兩種方法都具有數(shù)據(jù)庫相關(guān)的不透明性,最后會形成難于維護和不易擴展的代碼

一些公司嘗試自己開發(fā)數(shù)據(jù)存貯層,但是這種工作復(fù)雜龐大,除了大型的專業(yè)公司組織,一般的公司又何苦重復(fù)這種工作

使用對象-關(guān)系映射工具:
O/R工具已經(jīng)被經(jīng)常使用了,這種方法也比較成熟了,有很多O/R工具的提供商,業(yè)界的領(lǐng)導(dǎo)者是WebGain的TopLink以及Thought公司的CocoBase,還有ObjectMatter的Visual Business Sight Framework(VBSF)

雖然大多數(shù)O/R映射工具提供了簡單一致的API,簡化了工作,而且大多數(shù)O/R映射工具提供了較少嵌入,VBSF在這方面作的的確很不錯,同時它們也提供了一定的透明性,彌補了關(guān)系型數(shù)據(jù)庫的一些不足,但是他們都有各自專屬的API,不同的提供商間的映射技術(shù)區(qū)別較大,技術(shù)遷移問題很大.而且你還要自阿開發(fā)上多加一筆軟件許可費用

使用對象數(shù)據(jù)庫:
使用對象數(shù)據(jù)庫甚至還不使用O/R映射工具,假如使用這樣的產(chǎn)品你可能會被一個數(shù)據(jù)庫產(chǎn)品鎖死,而且數(shù)據(jù)存貯系統(tǒng)的變換肯定不是件輕易的事,再加上幾個主要的ODBMS提供商都公布會支持即將出現(xiàn)的JDO標準,所以這樣方案有待提高

J2EE的 CMP 方案
使用J2EE的 CMP 方案會受制于J2EE規(guī)范和應(yīng)用服務(wù)器廠商的限制,在EJB 1.1 CMP規(guī)范中就缺少很多的高級關(guān)聯(lián),新的CMP 2.0規(guī)范有很大進步,但EJB在代碼維護和性能上還是有不足

JDO方案:標準、開放、透明的應(yīng)用于Java的數(shù)據(jù)層
現(xiàn)在有兩個都以JDO命名的標準:Sun的 JDO和Castor JDO.

Sun的 JDO
Sun的 JDO 是由Java Community Process(JCP)制定開發(fā)的一套高級別的API規(guī)范,以及一個參考實現(xiàn).在1999.7 JDO規(guī)范請求(JSR-12)被通過,并在同一時間發(fā)布最終提議草案.除了這里規(guī)范外,它還包含了一個參考性的實現(xiàn)范例,它是在2001年第二季度完成的1.0 beta版,它使用一般的文件形式實現(xiàn)存儲

規(guī)范
SUN的 JDO規(guī)范定義了一個在應(yīng)用程序?qū)ο蠛蛡鹘y(tǒng)數(shù)據(jù)庫間的簡單、透明的接口.它已經(jīng)引起了數(shù)據(jù)庫廠商的愛好,一些廠商甚至已經(jīng)開始有所動作,但是由于該標準還在草案階段,目前只有一兩個beta實現(xiàn),還沒有廠商提供完整功能的產(chǎn)品

雖然Sun的JDO提供的是透明的存儲,但是ODMG(Object Data Management Group)的數(shù)據(jù)存儲接口和幾個主要的ODBMS提供商還是很大地影響這個規(guī)范。比如,映射機制格式(按xml格式定義)脫離了實現(xiàn)提供商而定義自己的格式,這限制了可移植性,在對抗JDO

該規(guī)范包含了以下幾個方面

含有事務(wù)的存儲

傳統(tǒng)對象和J2EE的交互

基于Java表達式的數(shù)據(jù)查詢

參考實現(xiàn)范例
Sun的JDO包含了一個使用一般文件功能有限的實現(xiàn),它答應(yīng)存儲、取出、瀏覽以及事務(wù)性地更新存儲實例(無查詢功能)

有關(guān)Sun JDO的第三方的實現(xiàn)可以分成兩類

非數(shù)據(jù)庫廠商

SolarMetric Kodo JDO

PrismTech OpenFusion JDO

TradeCity Cybersoft´s Rexip JDO

主要的數(shù)據(jù)庫廠商

Versant Judo

GemStone Systems

IBM´s Informix

Poet Software

Excelon (formerly Object Design)

Castor JDO
Castor JDO 是一個有Exolab贊助的從1999開始的一個open source 項目,盡管和Sun的JDO有一樣的名字,但它們并不兼容,但是也相差不大。Castor JDO非凡專注于關(guān)系型數(shù)據(jù)庫,所以并不支持存儲類型的透明性。它是open source的,沒有使用費用和專有權(quán),但由于它的開發(fā)團隊相對較小,即使比Sun的JDO標準早,但它的優(yōu)勢不會很長了,但Castor JDO仍然在解決數(shù)據(jù)層問題上作出了很多工作,也值得仔細研究

JDO:強壯的數(shù)據(jù)層
本篇文章提供了有關(guān)對象-關(guān)系問題的概覽、列舉了一個良好數(shù)據(jù)層的特質(zhì)。當現(xiàn)在還只有很多專屬的O/R映射工具的時候,我們更需要一個標準、開放接口的、多廠商支持或開放代碼的數(shù)據(jù)層實現(xiàn),目前有兩個這樣的規(guī)范Sun的JDO 和 Castor JDO.

在本系列文章的第2部分,我們將會介紹有關(guān)這兩種JDO的具體信息:它們?nèi)绾谓鉀Q數(shù)據(jù)層標準性、或者還有沒解決的問題。我們還會深入比較JDO和其他一些數(shù)據(jù)層技術(shù)的差別,比如EJB CMP 2.0

About the author
Jacek Kruszelnicki is president of Numatica Corporation, an information technology consulting firm providing eXPertise in information-systems strategy development, analysis, and planning; software development; and training. Jacek (pronounced Yatsek) received his master´s degree in computer science from Northeastern University in Boston, Mass., and has more than 15 years´ experience delivering maintainable, large-scale, distributed enterprise solutions.

英文原文:Persist data with Java Data Objects, Part 1

轉(zhuǎn)載自:http://mag.javadigest.net

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 拜泉县| 简阳市| 靖安县| 韩城市| 万盛区| 尖扎县| 阿拉尔市| 育儿| 方城县| 聂拉木县| 肥西县| 湘西| 利辛县| 恩平市| 金华市| 汤阴县| 泸西县| 新乡市| 新晃| 天镇县| 随州市| 凌源市| 青冈县| 潢川县| 广昌县| 九寨沟县| 云林县| 珲春市| 永清县| 长子县| 霍邱县| 中山市| 延寿县| 巴林左旗| 云浮市| 曲阳县| 台湾省| 武清区| 凌云县| 张家界市| 乡宁县|