PP团队圣经巨著《Application Architecture Guide2.0》14章-数据访问层
第十四章?數(shù)據(jù)訪問層指導
概覽
這一章主要描述設計數(shù)據(jù)訪問層時要注意的主要原則。它們覆蓋了設計數(shù)據(jù)訪問層遇到的通常問題及錯誤。下面的圖表展示了數(shù)據(jù)層怎樣嵌入一個通用的應用架構(gòu)。
?(cnblog我的圖片一直上傳不了,報Remote server Error,只能使用網(wǎng)絡圖片了)
?
數(shù)據(jù)訪問層組件
l???????? 數(shù)據(jù)訪問層組件。數(shù)據(jù)訪問層組件將訪問底層存儲介質(zhì)的必要方法抽象出來。將數(shù)據(jù)訪問功能集中起來,可以使應用程式便于配置和維護。
l???????? Data Helpers/Utilities。Helper和Utilities功能幫助操縱,轉(zhuǎn)變和獲取數(shù)據(jù)。他們由一些特別的類庫組成以增強數(shù)據(jù)訪問性能以及減少邏輯組件和服務代理的開發(fā)要求。
l???????? 服務代理。當業(yè)務組件必須將功能通過外部服務暴露時,你可能需要創(chuàng)建程式管理通信服務所需要的協(xié)議。服務代理將你的程式從調(diào)用不同的服務中分離出來,并且提供額外的服務,如服務的數(shù)據(jù)格式和你的應用程式需要的格式之間的映射。
?
方法
正確的設計數(shù)據(jù)層可以減少程式部署后的開發(fā)和維護工作。這章會簡要的概述一個設計訪問層有效的方法。當設計數(shù)據(jù)層時使用下面的方式:
1.?????? 創(chuàng)建一個總體的設計。
A.??????? 確定數(shù)據(jù)源要求。
B.??????? 確定數(shù)據(jù)訪問方式。
C.??????? 選擇怎樣映射數(shù)據(jù)結(jié)構(gòu)到數(shù)據(jù)源。
D.?????? 確認處理數(shù)據(jù)源錯誤時的策略。
E.??????? 確認怎樣連接數(shù)據(jù)源。
2.?????? 設計你的數(shù)據(jù)訪問層組件。
A.??????? 列舉你要訪問的數(shù)據(jù)源。
B.??????? 決定每一個數(shù)據(jù)源的訪問方式。
C.??????? 確認是否需要Hlper組件以簡化數(shù)據(jù)訪問組件開發(fā)和維護。
D.?????? 確認相關的設計模式。例如,考慮使用表格數(shù)據(jù),查詢對象,Repository,以及其它模式。
3.?????? 設計你的數(shù)據(jù)訪問層Helper組件。
A.??????? 識別可以從數(shù)據(jù)訪問組件中拿出來通用的功能以重用。
B.??????? 研究可用的Helper組件。
C.??????? 考慮為連接字符串,數(shù)據(jù)源認證,監(jiān)視以及異常處理設計自定義的Helper組件。
D.?????? 考慮實現(xiàn)數(shù)據(jù)訪問監(jiān)視和測試你的Helper組件。
E.??????? 考慮實現(xiàn)你的Helper組件安裝和日志。
4.?????? 設計服務代理。
A.??????? 使用合適的工具以添加引用。生成一個代理和數(shù)據(jù)類來代表服務中的數(shù)據(jù)契約。
B.??????? 確認服務怎樣使用。對于大多應用程式來說,最好在業(yè)務層和數(shù)據(jù)訪問層之間使用一個抽象層,這樣會提供一個一致的接口而不考慮數(shù)據(jù)源。對于小的應用程式來說,業(yè)務層或者表示層,可以直接訪問服務代理。
?
設計原則
下面的設計原則包括了設計數(shù)據(jù)層時應該考慮的不同方面。章節(jié)的剩余部分會提供給你選擇合適的技術和設計模式的詳細信息。
l???????? 選擇數(shù)據(jù)訪問技術。合適的數(shù)據(jù)訪問技術選擇依賴于你處理的數(shù)據(jù)類型,以及你怎樣操縱程式數(shù)據(jù)。特定的技術會適用特別的場景。下面的部分討論了所選擇的數(shù)據(jù)訪問技術的好處以及缺點。
l???????? 使用抽象以實現(xiàn)和數(shù)據(jù)訪問層松耦合的接口。這個可以通過定義接口組件來完成,如眾所周知的輸入和輸出Facade,可以將請求翻譯為層組件可以理解的信息。另外,你可以定義接口或抽象基類,以被組件實現(xiàn)。
l???????? 考慮穩(wěn)固的數(shù)據(jù)結(jié)構(gòu)。如果你要在數(shù)據(jù)訪問層處理基于Table的實體,考慮使用DTO來幫助你把數(shù)據(jù)轉(zhuǎn)換為統(tǒng)一的結(jié)構(gòu),DTO鼓勵使用粗粒度的操作,以使數(shù)據(jù)在不同的邊界層移動。
l???????? 用數(shù)據(jù)訪問層封裝數(shù)據(jù)訪問功能。數(shù)據(jù)訪問層隱藏了訪問數(shù)據(jù)源的詳細信息,它用來管理連接,生成查詢,以及映射程式實體到數(shù)據(jù)源結(jié)構(gòu)。數(shù)據(jù)訪問層的調(diào)用者使用自定義對象,Dataset,DataReader,以及XML文檔等抽象結(jié)構(gòu)來交互。其它應用程序?qū)邮褂貌僮鞲鼜碗s的方式來操縱數(shù)據(jù)以滿足應用程式功能。分開的考慮可以幫助應用程式開發(fā)和維護。
l???????? 決定怎樣映射應用程序?qū)嶓w到數(shù)據(jù)源結(jié)構(gòu)。應用程序使用的實體類型是最主要的決定因素。
l???????? 決定你怎樣來管理連接。實際上講,數(shù)據(jù)訪問層需要管理應用程序所有的數(shù)據(jù)源連接。你必須選擇合適的方法去存儲和保護連接信息以滿足應用程序的安全需要。
l???????? 決定你怎樣處理數(shù)據(jù)異常。數(shù)據(jù)訪問層應該捕獲以及處理所有和數(shù)據(jù)源、CRUD操作引起的異常。如果只是數(shù)據(jù)異常,數(shù)據(jù)源訪問及超時異常,數(shù)據(jù)訪問層應該處理。如果錯誤影響應用程式的功能或響應的話,那異常應該被傳遞到其它層。
l???????? 考慮安全風險。數(shù)據(jù)訪問層應該防止數(shù)據(jù)偷竊和破壞,保護訪問數(shù)據(jù)源的機制。應該使用“最少權限”的設計方法以限制需要執(zhí)行的應用程式操作。如果數(shù)據(jù)源自己有能力限制權限的話,那數(shù)據(jù)訪問層和數(shù)據(jù)源都要考慮安全。
l???????? 減少數(shù)據(jù)包往返。考慮使用批處理命令以使用一個數(shù)據(jù)庫操作。
l???????? 考慮性能和客觀上可測量性。可測量以及性能在設計數(shù)據(jù)訪問層時就應該被考慮。例如,當設計一個基于網(wǎng)絡的商業(yè)程式,數(shù)據(jù)層性能是程式的瓶頸。當數(shù)據(jù)訪問層性能是決定性時,要限制昂貴的數(shù)據(jù)操作。
?
數(shù)據(jù)訪問層設計
| Category | Common Issues |
| BLOB | 不適當?shù)脑跀?shù)據(jù)庫中存儲BLOBS以替代文件系統(tǒng)。 |
| ? | 對數(shù)據(jù)庫中的BLOB數(shù)據(jù)使用了不正確的類型。 |
| ? | 搜索以及操作BLOB數(shù)據(jù)。 |
| Batching | 沒有使用批處理以減少數(shù)據(jù)包往返。 |
| ? | Holding onto locks for excessive periods when batching. |
| ? | 沒有考慮使用批處理策略以減少數(shù)據(jù)庫數(shù)據(jù)包往返。 |
| Connections | 對連接池使用了不適當?shù)呐渲谩?/span> |
| ? | 沒有處理連接超時和連接斷掉。 |
| ? | 執(zhí)行的事務跨越過個連接。 |
| ? | 在過長的時間內(nèi)保持連接打開。 |
| ? | 使用單獨的認證以代替全信任的子系統(tǒng)去訪問數(shù)據(jù)庫。 |
| Data Format | 選擇了錯誤的數(shù)據(jù)格式。 |
| ? | 沒有考慮串行化需求。 |
| ? | 沒有映射對象到關系數(shù)據(jù)存儲。 |
| Excepion Management | 沒有處理數(shù)據(jù)訪問異常。 |
| ? | 沒有對調(diào)用者掩蓋數(shù)據(jù)庫異常。 |
| ? | 沒有記錄致命性的異常。 |
| Queries | 使用字符串連接來組建查詢語句。 |
| ? | 查詢混合了業(yè)務邏輯。 |
| ? | 對于查詢語句沒有優(yōu)化。 |
| Stored Procedures | 沒有正確的將參數(shù)傳給存儲過程。 |
| ? | 在存儲過程里實現(xiàn)業(yè)務邏輯。 |
| ? | 沒有考慮存儲過程里的動態(tài)SQL可以導致性能,安全以及可維護性。 |
| Transactions | 使用不正確的隔離等級。 |
| ? | 在多個數(shù)據(jù)源間使用了事務。 |
| ? | 使用了個別鎖,可能導致死鎖。 |
| ? | 允許長時間運行的事務導致鎖住了數(shù)據(jù)訪問。 |
| Validation | 對于數(shù)據(jù)字段沒有使用數(shù)據(jù)類型驗證。 |
| ? | 沒有處理NULL值。 |
| ? | 沒有過濾不正確的字符。 |
| XML | 沒有考慮怎樣處理非常大的XML DataSet. |
| ? | 沒有選擇合適的技術以方便XML和關系數(shù)據(jù)庫交互。 |
| ? | 沒有設置合適的索引導致沉重的XML查詢負擔。 |
| ? | 沒有使用Schema來驗證所有的XML輸入。 |
?
?
BLOB
BLOB是二進制的大型對象。如果數(shù)據(jù)以數(shù)據(jù)流的方式存儲或檢索,那它就是BLOB。BLOBs也許有結(jié)構(gòu),但顯然不是數(shù)據(jù)庫存儲的結(jié)構(gòu)或者數(shù)據(jù)訪問層讀寫的結(jié)構(gòu)。BLOB數(shù)據(jù)如果不能直接存儲在數(shù)據(jù)庫,則通常存儲在文件系統(tǒng)中。BLOBs典型的使用方式是存儲圖像數(shù)據(jù),但也經(jīng)常用于存儲以二進制為代表的對象。
?
當設計BLOBs策略時,考慮以下原則:
l???????? 當存儲圖像到硬盤不實際的時候,才會存儲到數(shù)據(jù)庫中。
l???????? 在服務器間使用BLOBs來簡化大型的二進制對象同步。
l???????? 考慮你是否需要搜索BLOB數(shù)據(jù)。如果需要的話,創(chuàng)建其它數(shù)據(jù)庫可搜索的字段來代替解析BLOB數(shù)據(jù)。
l???????? 考慮為BLOB數(shù)據(jù)使用文件系統(tǒng)以提高性能。數(shù)據(jù)庫的結(jié)構(gòu)和實現(xiàn)決定著系統(tǒng)性能提升的高度。使用文件系統(tǒng)你還要考慮存儲和同步數(shù)據(jù)庫中的相關元數(shù)據(jù)。
l???????? 當檢索BLOB,把它轉(zhuǎn)換成業(yè)務層或表現(xiàn)層需要操作的合適類型。
l???????? 當使用緩沖傳輸?shù)臅r候不要把BLOB數(shù)據(jù)存儲到數(shù)據(jù)庫中。
?
批處理
數(shù)據(jù)庫批處理命令可以提高數(shù)據(jù)訪問層的性能。在進入數(shù)據(jù)庫執(zhí)行環(huán)境前要消耗比較多的資源。批處理可以減少前端花費以及提高吞吐量和減少響應時間。對相似的查詢使用批處理比較好,因為數(shù)據(jù)庫對相似的查詢會使用緩存以減少查詢執(zhí)行計劃。
?
當設計批處理時,考慮以下原則:
l???????? 使用批處理以減少數(shù)據(jù)庫數(shù)據(jù)包往返以及減少網(wǎng)絡流量。
l???????? 為大量的相似查詢建立批處理可以獲得最大的效益。為不相似的或隨即的查詢建立批處理是無用的。
l???????? 使用批處理和命令以及DataReader以加載或拷貝多個數(shù)據(jù)集。
l???????? 當加載大量的基于文件的數(shù)據(jù)到數(shù)據(jù)庫時,使用BULK Copy工具。不要為長時間運行的批處理命令設置鎖。
?
連接
連接到數(shù)據(jù)源是數(shù)據(jù)訪問層的基礎。數(shù)據(jù)層必須管理所有的數(shù)據(jù)源連接。在數(shù)據(jù)層和數(shù)據(jù)源之間建立及管理連接都需要昂貴的資源。為了最大的提高性能,遵循下面的創(chuàng)建,管理和關閉連接原則。
l???????? 選擇一個策略以處理數(shù)據(jù)庫連接字符串。
l???????? 使用默認的連接池以減少活動的連接數(shù)量。
l???????? 確定連接沒有特別的不需要的字符。在效率不高的連接池里,多余的字符會使一些同樣功能的連接獲取到不同的值。
l???????? 在每一個事務后不要打開或關閉連接,考慮在一定的時間里保持連接以允許重用。在部署前,要模擬真實的負載情況來測試你的應用程式,對需要大量時間處理的地方做出改變以優(yōu)化性能。
l???????? 不要以來垃圾回收器來釋放連接。在明確的地方盡快釋放它們。
l???????? 在可能的地方使用單一的連接來執(zhí)行事務。
l???????? 設計Retry的機制以應付數(shù)據(jù)源丟失或連接超時的情況。
l???????? 由于安全原因,避免使用系統(tǒng)名或用戶數(shù)據(jù)源名(DSN)。
l???????? 考慮在配置文件里對連接信息加密。例如,使用.net內(nèi)置的機制加密連接字符串。
?
數(shù)據(jù)格式
正確的數(shù)據(jù)格式用來合理的解釋數(shù)據(jù)庫的原始字節(jié)以形成數(shù)據(jù)層傳遞的信息。選擇適當?shù)臄?shù)據(jù)格式可以提高程式間的互操作性,簡化不同進程和機器間的串行化通信。數(shù)據(jù)格式和串行對于業(yè)務層存儲和檢索非常重要。
?
當設計數(shù)據(jù)格式時,考慮以下原則:
l???????? 為程式選擇合適的數(shù)據(jù)格式。
l???????? 在很多情況下,你需要使用自定義的數(shù)據(jù)或業(yè)務實體來提高程式可維護性。這需要額外的代碼來映射實體到數(shù)據(jù)庫操作。O/RM解決方案可以減少大量的自寫代碼。
l???????? 數(shù)據(jù)訪問層使用的數(shù)據(jù)結(jié)構(gòu)不能包含業(yè)務規(guī)則。
l???????? 當使用經(jīng)常改變的結(jié)構(gòu)化數(shù)據(jù)時可以使用XML。
l???????? 決定數(shù)據(jù)的串行化需求。
l???????? 考慮互操作性需求。
?
異常管理
在數(shù)據(jù)庫中設計統(tǒng)一的異常管理策略。如果可能,在數(shù)據(jù)庫Helper組件中使用統(tǒng)一的異常處理邏輯。要特別注意在信任的層邊界發(fā)生的異常。設計不能處理的異常策略以使敏感的應用程式信息不會暴露。
?
當設計異常管理策略時,考慮以下原則:
l???????? 決定哪些異常可以呈現(xiàn)給調(diào)用者。死鎖,連接問題和網(wǎng)絡檢測可以在數(shù)據(jù)層解決。
l???????? 實現(xiàn)全局的異常處理以捕獲不可知的異常以及將它拋給原調(diào)用者。
l???????? 當通過服務接口來暴露數(shù)據(jù)層時,使用異常屏蔽信息以避免暴露敏感數(shù)據(jù)。
l???????? 在數(shù)據(jù)層中處理所有數(shù)據(jù)訪問相關的異常。
l???????? 考慮對數(shù)據(jù)源錯誤和操作超時實現(xiàn)Retry機制。
l???????? 告訴User異常會影響程式體驗。考慮將異常信息傳到業(yè)務層處理以及將它報告給User。
l???????? Log異常以容易的查找特定的錯誤。
l???????? 如果有多個數(shù)據(jù)源,記錄異常和錯誤的時候要包括單個數(shù)據(jù)源信息。
?
查詢
查詢是數(shù)據(jù)層主要的數(shù)據(jù)操作方式。它們將程式請求轉(zhuǎn)換為Create,Retrieve,Update和Delete(CRUD)數(shù)據(jù)庫操作。由于查詢是很基本的東西,所以應該優(yōu)化查詢以最大的提高數(shù)據(jù)庫性能和吞吐量。
?
當設計數(shù)據(jù)層查詢,考慮以下的原則:
l???????? 當存儲過程不實用的時候使用SQL查詢語句。
l???????? 在SQL語句中使用參數(shù)以減少SQL注入。
l???????? 當需要動態(tài)的創(chuàng)建查詢,不要允許用戶輸入來決定查詢的詳細信息。
l???????? 在數(shù)據(jù)層中不要使用字符串拼湊來創(chuàng)建動態(tài)查詢。
l???????? 使用對象來創(chuàng)建查詢。例如,實現(xiàn)Query Object模式或使用ADO.NET對象。
?
存儲過程
存儲過程可以優(yōu)化查詢性能以及提高安全。它比SQL語句提供了更高的性能因為數(shù)據(jù)庫可以針對它做出執(zhí)行優(yōu)化,并且可以根據(jù)存儲過程里的語句來優(yōu)化數(shù)據(jù)庫。存儲過程也提供了額外的安全,因為調(diào)用者可以從它獲取數(shù)據(jù)而不用去數(shù)據(jù)庫表或者視圖里獲取。存儲過程同樣可以參數(shù)化以支持多個應用程式的復雜查詢。
?
當設計存儲過程,考慮以下原則:
l???????? 使用存儲過程來提高數(shù)據(jù)庫效率和數(shù)據(jù)層安全。
l???????? 使用Output參數(shù)來返回單個的值。
l???????? 避免動態(tài)SQL。當數(shù)據(jù)訪問是程式的瓶頸時盡可能的使用存儲過程。
l???????? 對于單個的數(shù)據(jù)輸入考慮使用單個的參數(shù)。
l???????? 對于列表形式的數(shù)據(jù)考慮使用XML參數(shù)。
l???????? 使用適當?shù)氖聞諄肀3謹?shù)據(jù)一致性。
l???????? 設計合適的異常處理返回錯誤以被應用程式處理。
l???????? 在存儲過程里避免實現(xiàn)業(yè)務邏輯。
l???????? 當處理數(shù)據(jù)時避免創(chuàng)建臨時表。而且,在內(nèi)存中創(chuàng)建、使用臨時表比在磁盤中好。
?
事務
事務是將一系列的數(shù)據(jù)庫操作作為一個原子單元聯(lián)系起來以滿足請求和保證數(shù)據(jù)庫一致性。當所有動作的信息完成以及數(shù)據(jù)庫的數(shù)據(jù)永久性更改代表了事務結(jié)束。事務可以在發(fā)生的錯誤的時候回滾數(shù)據(jù)庫以保證數(shù)據(jù)庫的ACID屬性。
?
當設計事務時,考慮以下原則:
l???????? 在需要的時候使用事務。例如,對于一個單獨的SQL語句不需要使用事務,因為SQLSERVER可以自動將每一個SQL操作作為一個事務來執(zhí)行。
l???????? 保持事務盡可能的短以減少鎖住的時間。
l???????? 使用合適的隔離等級。數(shù)據(jù)一致性的平衡是很有爭議的。高隔離級可以在并發(fā)的時候提供高的數(shù)據(jù)一致性。低隔離級可以通過降低一致性的花費而提高性能。
l???????? 如果針對一個數(shù)據(jù)庫執(zhí)行事務,可以使用人工控制的事務。
l???????? 如果一個單獨的事務跨越了多個數(shù)據(jù)庫,那你應該使用自動的事務。
l???????? 避免混合人工控制和自動的事務。
l???????? 如果使用人工控制的事務,考慮在存儲過程里實現(xiàn)事務。
l???????? 考慮在事務里使用MARS來加強并發(fā)以避免潛在的死鎖問題。
l???????? 如果執(zhí)行多條Insert,Update和Delete,將他們在一個事務里處理以獲取更好的性能。
?
驗證
設計一個有效的輸入和數(shù)據(jù)驗證策略對你的程式安全至關重要。決定從其它層,第三方組件,數(shù)據(jù)庫或數(shù)據(jù)存儲獲取的數(shù)據(jù)驗證規(guī)則。你可以驗證任何在你信任的邊界中通過的數(shù)據(jù)。
l???????? 驗證數(shù)據(jù)層中調(diào)用者發(fā)出的所有數(shù)據(jù)。
l???????? 驗證所有從數(shù)據(jù)庫中檢索的數(shù)據(jù)。
l???????? 你可以驗證任何在你信任的邊界中通過的數(shù)據(jù)。
l???????? 決定其它層的驗證方式。如果數(shù)據(jù)已經(jīng)是可信的數(shù)據(jù),那沒必要重復驗證。
l???????? 當設計驗證時考慮數(shù)據(jù)輸入的目的。
l???????? 在執(zhí)行數(shù)據(jù)庫Update前驗證所有的數(shù)據(jù)。
l???????? 當驗證失敗的時候返回警告信息。
?
XML
XML在數(shù)據(jù)庫外是維護數(shù)據(jù)結(jié)構(gòu)的很有用的方式。由于性能原因,在大量數(shù)據(jù)集時小心使用XML。使用Schema去驗證XML結(jié)構(gòu)和內(nèi)容。
?
當設計XML使用時,考慮以下原則:
l???????? 使用XML讀寫器去訪問XML格式的數(shù)據(jù)。
l???????? 使用XML Schema來定義數(shù)據(jù)存儲格式和傳遞。
l???????? 用適當?shù)?/span>Schema來驗證接收到的XML。
l???????? 在XML Schema里為復雜的數(shù)據(jù)參數(shù)使用自定義的驗證。
l???????? 用特定類型的列來存儲XML,如果可能的話,使用數(shù)據(jù)庫來獲取最大的性能。
l???????? 對于讀Sqlserver里XML數(shù)據(jù)比較頻繁的程式,考慮使用XML索引。
?
管理注意點
當設計管理策略時,考慮以下原則:
l???????? 仔細考慮你是否需要創(chuàng)建自定義的實體或者其它數(shù)據(jù)表示可以更好的滿足需求。開發(fā)自定義的實體會加重開發(fā)負擔。通常,自定義實體是為了方便開發(fā)者定制。
l???????? 從一個基類派生業(yè)務實體可以提供基本的功能和封裝通用的Task。
l???????? 依靠為復雜數(shù)據(jù)使用內(nèi)置的DataSet或XML Document來代替內(nèi)部的集合,結(jié)構(gòu)和其它編程結(jié)構(gòu)。
l???????? 實現(xiàn)一個通用的集合接口以從你的業(yè)務實體暴露通用的功能集合。
l???????? 設計業(yè)務實體依賴于用于數(shù)據(jù)庫交互的數(shù)據(jù)訪問組件。統(tǒng)一實現(xiàn)數(shù)據(jù)訪問策略和相關的業(yè)務邏輯。例如,如果你的業(yè)務實體直接訪問SQLSERVER,那所有部署的程式客戶端使用的業(yè)務實體都需要SQL連接和驗證策略。
l???????? 使用存儲過程來從潛在的數(shù)據(jù)Shema中抽象數(shù)據(jù)訪問。小心不要過度使用存儲過程因為它會降低代碼維護和重用,包括存儲過程維護。過度使用的癥狀就是大量的存儲過程互相調(diào)用。避免使用它們來實現(xiàn)控制流,操縱單個的值以及一些在T-SQL中難以實現(xiàn)的功能。
?
性能考量
數(shù)據(jù)層設計及數(shù)據(jù)庫設計都要考慮性能。在調(diào)節(jié)系統(tǒng)吞吐量的時候考慮以上兩點。
?
當設計性能策略時,考慮以下原則:
l???????? 考慮改變數(shù)據(jù)查詢隔離級別。如果你在創(chuàng)建一個高吞吐量的程式,特殊的數(shù)據(jù)操作業(yè)務可能會在較低的隔離級執(zhí)行。混合的隔離級別會影響系統(tǒng)數(shù)據(jù)的一致性,因此你要通過一個個實際例子小心的分析它。
l???????? 考慮批處理命令以減少數(shù)據(jù)庫的數(shù)據(jù)包往返。
l???????? 使用連接池以及根據(jù)模擬實際場景來調(diào)節(jié)性能。
l???????? 對非變化的數(shù)據(jù)使用并發(fā)來減輕數(shù)據(jù)庫鎖數(shù)據(jù)的花費。這可以避免鎖住數(shù)據(jù)庫行,以及因為鎖一直打開的數(shù)據(jù)庫連接。
l???????? 如果更新數(shù)據(jù)只需要很少的時間,而且數(shù)據(jù)容易被更改,那盡量避免使用并發(fā)。長時間的鎖越多,設計的可能性就越少。
l???????? 使用DataReader來執(zhí)行順序的查找有助于提高性能。
?
安全考量
數(shù)據(jù)層必須保護數(shù)據(jù)庫免受偷竊或者破壞。同時也必須保護數(shù)據(jù)源可受訪問。
當設計安全策略時,考慮以下原則:
l???????? 當使用SqlServer時,考慮使用Windows驗證而不是SQL驗證。
l???????? 考慮到性能問題,避免中間層來扮演此角色。
l???????? 驗證所有穿越可信任邊界的數(shù)據(jù)。
l???????? 如果使用SQL語句,考慮使用參數(shù)方法來代替字符串拼湊以防止SQL注入。
l???????? 在配置文件里加密連接字符串以代替使用系統(tǒng)或DSN。
l???????? 加密敏感數(shù)據(jù)或使用數(shù)據(jù)庫加密來存儲密碼,使用Hash代替加密密碼版本。
l???????? 在網(wǎng)絡或Internet傳遞時,加密敏感數(shù)據(jù)。
l???????? 考慮在訪問數(shù)據(jù)源中實現(xiàn)最少權限。
l???????? 在數(shù)據(jù)層中要求調(diào)用者使用身份認證來審核。
l???????? 記錄登陸和身份認證信息。
?
部署考量
當部署數(shù)據(jù)訪問層,軟件架構(gòu)師要考量生產(chǎn)環(huán)境中的性能和安全問題。
?
當部署數(shù)據(jù)訪問層時,考慮以下原則:
l???????? 把數(shù)據(jù)層和業(yè)務層放到同一個位置以提高程式性能。
l???????? 如果你要支持一個遠程的數(shù)據(jù)訪問層,考慮使用TCP協(xié)議來提高性能。
l???????? 你不能把數(shù)據(jù)訪問層和數(shù)據(jù)庫服務器放到一起。
?
模式映射
| Category | Patterns |
| General | ? Active Record ? Application Service ? Domain Model ? Layered Architecture ? Transaction Script ? Table Data Gateway ? Repository |
| Exception Management | ? Exception Shielding |
| Transactions | ? Master-Master Replication ? Coarse Grained Lock ? Capture Transaction Details ? Implicit Lock ? Optimistic Offline Lock ? Pessimistic Offline Lock ? Transaction Script |
?
重要模式
l???????? Active Record。 將數(shù)據(jù)訪問層放置域?qū)ο笾小?/span>
l???????? Capture Transactions Details。創(chuàng)建數(shù)據(jù)庫對象,如觸發(fā)器和記錄表,來記錄變化。
l???????? Repository。封裝數(shù)據(jù)庫和持久化操作中的對象集。
l???????? Data Transfer Object。使用數(shù)據(jù)對象來減少調(diào)用方法的次數(shù)。
l???????? Table Data Gateway。讓sql統(tǒng)一訪問一個表或視圖來完成Select,Insert,Update和Delete操作。
?
技術考量
當選擇合適的數(shù)據(jù)層技術時,考慮以下原則:
l???????? 使用客戶端的數(shù)據(jù)庫訪問以提高性能。
l???????? 考慮使用企業(yè)庫模塊來簡化數(shù)據(jù)訪問代碼。
l???????? 使用System.Xml和其子命名空間來操作XML格式的數(shù)據(jù)。
l???????? 使用DataReader來呈現(xiàn)數(shù)據(jù)對基于asp.net的用戶接口比較有益,DataReader是一個只讀的,向前的讀寫器,讀取每一行的速度很快。
?
Additional Resources
For more information on data access performance, see the following resources:
? Architecture and Design Review of a .NET Application for Performance and Scalability
at http://msdn.microsoft.com/en-us/library/ms998544.aspx
? Design Guidelines for Application Performance at http://msdn.microsoft.com/enus/
library/ms998541.aspx
? Improving ADO.NET Performance at http://msdn.microsoft.com/enus/
library/ms998569.aspx
? Improving SQL Server Performance at http://msdn.microsoft.com/enus/
library/ms998577.aspx
? ADO.NET Scenarios - Optimistic Concurrency at http://msdn.microsoft.com/enus/
library/aa0416cz(VS.71).aspx
For more information on data access design patterns, see the following resources:
? Data Patterns at http://msdn.microsoft.com/en-us/library/ms998446.aspx.
? Enterprise Solution Patterns Using Microsoft .NET at http://msdn.microsoft.com/enus/
library/ms998469.aspx
For more information on general data access guidelines, see the following resources:
? .NET Data Access Architecture Guide at http://msdn.microsoft.com/enus/
library/ms978510.aspx
? Typing, storage, reading, and writing BLOBs at http://msdn.microsoft.com/enus/
library/ms978510.aspx#daag_handlingblobs
? Using stored procedures instead of SQL statements at http://msdn.microsoft.com/enus/
library/ms978510.aspx
? Sample ADO.NET scenarios
For more information on security, see the following resources:
? Architecture and Design Review for Security at http://msdn.microsoft.com/enus/
library/aa302421.aspx
? Design Guidelines for Secure Web Applications at http://msdn.microsoft.com/enus/
library/aa302420.aspx
轉(zhuǎn)載于:https://www.cnblogs.com/niujunjie1/archive/2008/11/27/1342538.html
總結(jié)
以上是生活随笔為你收集整理的PP团队圣经巨著《Application Architecture Guide2.0》14章-数据访问层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 期待N年 天才级的全画幅CMOS终于要大
- 下一篇: 为量产FF91拼了!贾跃亭又找来6亿美元