一 、ORM 框架是為了解決什么問(wèn)題而出現(xiàn)的呢,?
面向?qū)ο蠼:途幊探?jīng)過(guò)這么多年的發(fā)展已經(jīng)相當(dāng)成熟,,其優(yōu)勢(shì)在于能夠適應(yīng)軟件開(kāi)發(fā)過(guò)程中的不斷變化的需求。在面向?qū)ο缶幊痰臅r(shí)候很顯然我們建立的對(duì)象是放在計(jì)算機(jī)內(nèi)存之中,,如果關(guān)閉計(jì)算機(jī)那么我們的對(duì)象就不存在了,,對(duì)象的永久性(也就是長(zhǎng)久保存對(duì)象)是我們一直的期望。在O/R Mapping出現(xiàn)前我們?cè)O(shè)計(jì)程序不得不花費(fèi)大量的精力和時(shí)間構(gòu)建我們的Data Access Layer (DAL數(shù)據(jù)存取層),,如果項(xiàng)目規(guī)模比較大的時(shí)候可想而知這個(gè)DAL層的復(fù)雜程度,,涉及到異構(gòu)數(shù)據(jù)庫(kù)那就更加復(fù)雜。
二,、ORM 框架 的出現(xiàn)是為了解決兩個(gè)問(wèn)題:
1. 數(shù)據(jù)庫(kù)無(wú)關(guān)性:平滑遷移數(shù)據(jù)庫(kù)和異構(gòu)數(shù)據(jù)庫(kù),;
2. 實(shí)體對(duì)象的持久性:關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)與對(duì)象的對(duì)應(yīng)關(guān)系。
從這里就可以初步看出,,架構(gòu)至少有兩個(gè)層次:
1. 數(shù)據(jù)庫(kù)存取層Database Access Layer作為核心層,,實(shí)現(xiàn)數(shù)據(jù)庫(kù)無(wú)關(guān)性;
2. 實(shí)體對(duì)象映射層 ObjectMapping Layer 作為應(yīng)用層實(shí)現(xiàn)數(shù)據(jù)到實(shí)體對(duì)象的映射,,該層依賴于核心層,。
1.數(shù)據(jù)庫(kù)存取核心層是獨(dú)立通用處于最底層的實(shí)現(xiàn),可以直接拿出來(lái)使用的,,必須保持高效和安全,,主要的功能如下:
* 規(guī)范數(shù)據(jù)庫(kù)操作,構(gòu)造 Database 工廠模式(可拓展性),,形成數(shù)據(jù)庫(kù)操作類 【微軟的 Data Access Application Block 】
* 規(guī)范 SQL 語(yǔ)句,,解決不同的數(shù)據(jù)庫(kù)之間的 SQL 語(yǔ)句的差異【最簡(jiǎn)單的方式方式就是在程序中以SQL語(yǔ)句Id的形式調(diào)用SQL語(yǔ)句,將SQL語(yǔ)句集中于一個(gè)文件,。iBatis 的 DataMapper 采用類似機(jī)制,,不過(guò)它采用的是XML格式,格式的冗余數(shù)據(jù)降低了加載的效率,,在保存加載機(jī)制上不夠靈活,,至少該讓用戶選擇保存為不同的格式;iBatis DataMapper 另一個(gè)問(wèn)題就是將 ObjectMapping 也包含其中,層次不分明,,降低可復(fù)用性,,】。
2.實(shí)體對(duì)象映射層考慮的問(wèn)題就多了:
* 簡(jiǎn)單實(shí)體對(duì)象屬性的映射
* Collection對(duì)象屬性的映射,,如實(shí)體對(duì)象購(gòu)物車的物品清單就是一個(gè)Collection對(duì)象屬性,,收錄了該購(gòu)物車中的所有的物品。
* 實(shí)體對(duì)象 MetaData 的考慮,,
* 業(yè)務(wù)規(guī)則,,約束的考慮等等。,。,。
這里實(shí)體對(duì)象映射層是效率最低的一個(gè)層次,原因在于映射操作:將實(shí)體對(duì)象變?yōu)閿?shù)據(jù)庫(kù)數(shù)據(jù),,數(shù)據(jù)庫(kù)數(shù)據(jù)變?yōu)閷?shí)體對(duì)象,,而正是這個(gè)映射操作使得運(yùn)行速度大大降低,內(nèi)存占用大大的增加,。如果將所有的實(shí)體數(shù)據(jù)不分青紅皂白全部對(duì)象化,,那么即使是采用Cache(是以犧牲內(nèi)存為代價(jià)的)和分頁(yè)機(jī)制(一次不要取個(gè)萬(wàn)把千條數(shù)據(jù)的,客戶也看不過(guò)來(lái),,一次百來(lái)?xiàng)l數(shù)據(jù)就差不多了,,這樣就減少了內(nèi)存的占用和映射操作的時(shí)間),但是,,當(dāng)系統(tǒng)面臨逐漸增加的并發(fā)訪問(wèn)數(shù)量面前,,系統(tǒng)的性能惡化相當(dāng)厲害。企業(yè)級(jí)應(yīng)用,,也許是特指那些愿意花高價(jià)購(gòu)買IBM RS/6000之流的機(jī)器的冤大頭們吧,。但是對(duì)于我們這些搞技術(shù)的,則是該將注意力集中在如何充分挖掘機(jī)器的每一分潛力上才是,,相信對(duì)于每一個(gè)量入為出的企業(yè)來(lái)說(shuō),,它應(yīng)該是欣賞的。這個(gè)目前也沒(méi)有想到什么好的辦法,,對(duì)于減少內(nèi)存開(kāi)銷,,有個(gè)建議就是在設(shè)計(jì)時(shí)候,盡可能的延遲加載時(shí)間(如實(shí)體對(duì)象購(gòu)物車的物品清單,,實(shí)際數(shù)據(jù)的加載只有當(dāng)訪問(wèn)該屬性的時(shí)候才加載,,而對(duì)于大的備注,Blob類型的屬性也可以采取類似的機(jī)制)。實(shí)際上,,大多數(shù)用戶的操作都是在瀏覽,,因此對(duì)于瀏覽數(shù)據(jù)的形式,,可以繞過(guò)ObjectMapping層,通過(guò)數(shù)據(jù)庫(kù)存取層返回dataset直接操作,,這樣也能進(jìn)一步提高速度和降低內(nèi)存的消耗,。