成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

架構(gòu)設(shè)計(jì):數(shù)據(jù)訪問層簡述

開發(fā) 架構(gòu)
這篇博客我們將繼續(xù)進(jìn)入我們的下一層:數(shù)據(jù)訪問層。無論你用的是什么開發(fā)模式或者是業(yè)務(wù)模式,到最后最必須具有持久化機(jī)制,持久化到持久化介質(zhì),并能對數(shù)據(jù)進(jìn)行讀取和寫入CRUD。這就是數(shù)據(jù)訪問層。

在前面簡單描述了下服務(wù)層SOA面向服務(wù)架構(gòu)架構(gòu)設(shè)計(jì)-業(yè)務(wù)邏輯層,以及一些面向設(shè)計(jì)原則理解軟件架構(gòu)設(shè)計(jì)箴言。這篇博客我們將繼續(xù)進(jìn)入我們的下一層:數(shù)據(jù)訪問層。無論你用的是什么開發(fā)模式或者是業(yè)務(wù)模式,到最后最必須具有持久化機(jī)制,持久化到持久化介質(zhì),并能對數(shù)據(jù)進(jìn)行讀取和寫入CRUD。這就是數(shù)據(jù)訪問層。你可能是利用xml等文件格式磁盤存儲(chǔ),常用的關(guān)系數(shù)據(jù)庫存儲(chǔ),或者NoSql(not only sql)的內(nèi)存存儲(chǔ)或文檔存儲(chǔ)等等存儲(chǔ)介質(zhì)。而這里我只關(guān)心關(guān)系數(shù)據(jù)庫存儲(chǔ)。

數(shù)據(jù)層需要提供的職責(zé)有:

1:CRUD服務(wù)。作為唯一可以與存儲(chǔ)介質(zhì)交互的中間層出現(xiàn),負(fù)責(zé)業(yè)務(wù)對象的增加,修改,刪除,加載。

2:查詢服務(wù)。這不同于CRUD中的R(read),read傾向于的單個(gè)對象,元組。而這里的查詢針對復(fù)雜查詢,比如一個(gè)國內(nèi)電商的客戶為四川的訂單。這里會(huì)涉及倉儲(chǔ)層。所謂倉儲(chǔ)模式指的是一個(gè)提供業(yè)務(wù)對象查詢的類,他隱藏了數(shù)據(jù)查詢的解析步驟,封裝sql解析邏輯。

3:事務(wù)管理。這里所說的是業(yè)務(wù)事務(wù),在一個(gè)應(yīng)用系統(tǒng)中每次請求都會(huì)產(chǎn)生多次的多數(shù)據(jù)對象的新增,修改,刪除操作。如果我們每次都依次代開數(shù)據(jù)庫連接,準(zhǔn)備數(shù)據(jù)包,操作數(shù)據(jù)庫,關(guān)閉數(shù)據(jù)連接。這些將會(huì)給我們帶來很多不必要的性能開銷。數(shù)據(jù)庫管理員經(jīng)常會(huì)要求“盡量少的與數(shù)據(jù)庫交互”,這也必須成為我們的開發(fā)原則。更好的操作是我們在內(nèi)存中建立一個(gè)和數(shù)據(jù)倉庫,維護(hù)變化的對象,在業(yè)務(wù)操作完成一次性提交到數(shù)據(jù)存儲(chǔ)介質(zhì),提供業(yè)務(wù)事務(wù)。業(yè)務(wù)事務(wù)有個(gè)很好聽的名字工作單元(UOW),在微軟給我們提供的DataSet,orm框架都回必須存在業(yè)務(wù)事務(wù)。

4:并發(fā)處理。UOW應(yīng)避免業(yè)務(wù)數(shù)據(jù)連接的多次提交打開而出現(xiàn),但在內(nèi)存離線操作,這就可能導(dǎo)致數(shù)據(jù)一致性問題。在多用戶的環(huán)境,對數(shù)據(jù)并發(fā)處理需要制定一個(gè)策略。一般我們會(huì)采用樂觀并發(fā)處理:用戶可以任意的離線修改,在修改更新時(shí)候檢查對象是否被修改,如果被修改者本次更新失敗。簡單的說就是防止丟失修改。防止丟失修改,我們可以采用where 加上一系列原值,或者加上修改時(shí)間戳或者版本號標(biāo)記。同時(shí)還有許多其他的并發(fā)解決模式,但樂觀并發(fā)鎖用到更普遍。

5:數(shù)據(jù)上下文:整和所有職責(zé)。在數(shù)據(jù)訪問層概念職責(zé)都會(huì)有一個(gè)共同的暴露給外部的接口。我們需要一個(gè)高層次的組件,來同一提供對數(shù)據(jù)存儲(chǔ)介質(zhì)的訪問操作。,同一訪問數(shù)據(jù)庫CRUD,事務(wù),并發(fā)服務(wù)的高層次類,叫做數(shù)據(jù)上下文(Context)。EF中的ObjectContext,NHibernate的session,linq to sql 的DataContext等等。

數(shù)據(jù)訪問層的一些概念(這里不會(huì)是全部,僅一些個(gè)人覺得重要的概念):

1: 數(shù)據(jù)映射器:將內(nèi)存中修改的對象提交至存儲(chǔ)介質(zhì),則需要要映射邏輯來完成,數(shù)據(jù)映射器就是就是一個(gè)實(shí)現(xiàn)將某種類型的業(yè)務(wù)對象持久化的類(數(shù)據(jù)映射器模式定義如《P of EAA》)。

2:倉儲(chǔ)層(Repository):在上面提到:所謂倉儲(chǔ)模式指的是一個(gè)提供業(yè)務(wù)對象查詢的類,他隱藏了數(shù)據(jù)查詢的解析步驟,封裝sql解析邏輯。在面向?qū)ο蟮氖澜缋镂覀冇脤ο筮M(jìn)行查詢,返回結(jié)果為對象集。這里的查詢可能是從數(shù)據(jù)庫,或者來至緩存,這取決你的策略,你倉儲(chǔ)層的實(shí)現(xiàn)。

3:工作單元(UOW):Martin Fowler《P of EAA》 定義:工作單元記錄在業(yè)務(wù)事務(wù)過程中對數(shù)據(jù)庫有影響的所有變化。操作結(jié)束后,作為一種結(jié)果,工作單元了解所有需要對數(shù)據(jù)庫做的改變。在上面第3點(diǎn)業(yè)務(wù)事務(wù)講的差不多,這里不是累述。

4:標(biāo)示映射(Identity Map):其作用在于:便于跟蹤業(yè)務(wù)對象,調(diào)用者在一個(gè)業(yè)務(wù)事務(wù)中使用的是同一個(gè)實(shí)例,而不是每次執(zhí)行產(chǎn)生一個(gè)新的對象。表示映射為一個(gè)散列表存儲(chǔ)(散列具有快速定位O(1))。類似于緩存的實(shí)現(xiàn)方式,保證了在同一個(gè)業(yè)務(wù)事務(wù)數(shù)據(jù)上下文引用修改同一個(gè)業(yè)務(wù)對象。但絕不同于緩存。從持續(xù)時(shí)間來說,標(biāo)示映射生命周期為業(yè)務(wù)事務(wù)內(nèi)。實(shí)現(xiàn)上等同于數(shù)據(jù)上下文期。但比起緩存來說其周期太短,根本不能對性能有多大的改善。緩存更重要的命中率,而標(biāo)示映射保證同一數(shù)據(jù)上下文采用修改同一個(gè)業(yè)務(wù)對象的引用。

5:樂觀并發(fā)鎖:在上面也曾提到,其保證離線操作數(shù)據(jù)的對數(shù)據(jù)一致性的沖突解決方法。首先樂觀在于允許離線操作,容忍沖突,防止數(shù)據(jù)丟失修改,可利用原讀取數(shù)據(jù)值得where條件或者時(shí)間戳,版本號解決。

6:延時(shí)加載:對象并不是一次性加載完成,而是按照需求多次加載數(shù)據(jù),到用時(shí)加載。業(yè)務(wù)對象太多關(guān)聯(lián),數(shù)據(jù)量太多余龐大,而我們每次業(yè)務(wù)事務(wù)需要操作的對象都只會(huì)是部分,不需要太多的數(shù)據(jù)對象。同事業(yè)務(wù)對象中還存在循環(huán)引用,這樣不適于對象整體的一次性加載。延時(shí)加載提供了優(yōu)化,意圖在“盡可能的少加載,并按需加載,只加載需要的數(shù)據(jù)部分”。

7:持久化透明對象(PI或POCO):當(dāng)對象模型不存在任何外部依賴,特別是對于數(shù)據(jù)訪問層的依賴,那么這個(gè)模型就是持久化透明的,POCO。一個(gè)POCO的對象不需要繼承至某個(gè)特定的類,實(shí)現(xiàn)特定的接口,或提供專門的構(gòu)造函數(shù)。一個(gè)非持久化透明的對象這以為者存在外部的依賴,而我們更喜歡領(lǐng)域?qū)ο笾皇且粋€(gè)簡單額c#類,可以在持久化層等獨(dú)立切換。這就導(dǎo)致實(shí)現(xiàn)的時(shí)候我們無法很直接的跟蹤業(yè)務(wù)對象,這就是面向方面編程(AOP)或者代理模式的大顯身手。可惜AOP在.net中不是那么直接,很多ORM框架如NHibernate之類的利用代理模式Emit動(dòng)態(tài)注入IL實(shí)現(xiàn)跟蹤,添加新的行為。所以NHibernate中要求領(lǐng)域?qū)ο蟮乃凶侄螌傩苑椒ǘ急仨毷翘摲椒芍貙懙摹?

8:CQRS(Command Query Responsibility Segregation,命令查詢職責(zé)分離):CQRS是在DDD的實(shí)踐中引入CQS理論而出現(xiàn)的一種體系結(jié)構(gòu)模式,命令和查詢被分離。具體可以參 Martin Fowler的CQRS文章: http://martinfowler.com/bliki/CQRS.html

原文鏈接:http://www.cnblogs.com/whitewolf/archive/2012/06/05/2535486.html

責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2012-06-07 10:35:40

架構(gòu)設(shè)計(jì)業(yè)務(wù)邏輯Java

2021-01-11 10:19:51

安全架構(gòu)

2017-11-24 08:32:04

架構(gòu)設(shè)計(jì)存儲(chǔ)

2012-05-30 09:43:45

業(yè)務(wù)邏輯層

2012-06-07 10:22:48

架構(gòu)設(shè)計(jì)邏輯層物理層

2009-07-28 09:42:22

.NET數(shù)據(jù)訪問層

2018-11-27 16:21:36

操作系統(tǒng)Fuchsia谷歌

2016-05-09 09:26:06

架構(gòu)ios網(wǎng)絡(luò)層

2022-04-04 17:41:22

分布式IT安全

2024-11-27 13:01:22

應(yīng)用層領(lǐng)域?qū)?/a>對接層

2012-06-07 10:25:35

架構(gòu)設(shè)計(jì)服務(wù)層軟件設(shè)計(jì)

2010-09-17 08:50:30

Visual Stud

2022-12-13 09:54:52

數(shù)據(jù)倉庫

2013-05-27 10:58:28

Tumblr架構(gòu)設(shè)計(jì)雅虎收購

2009-06-23 08:08:45

J2EE體系架構(gòu)會(huì)話面數(shù)據(jù)訪問對象

2017-04-24 11:01:59

MySQL數(shù)據(jù)庫架構(gòu)設(shè)計(jì)

2011-11-02 09:01:30

系統(tǒng)架構(gòu)師

2023-08-16 12:34:16

同步備份異步備份

2015-06-02 04:17:44

架構(gòu)設(shè)計(jì)審架構(gòu)設(shè)計(jì)說明書

2025-05-09 08:45:13

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产不卡在线观看 | 情侣酒店偷拍一区二区在线播放 | 成人免费视频 | 国产色婷婷精品综合在线播放 | 国产成人免费 | 欧美成人一级视频 | 黄色大片观看 | av看看 | 国产一区二区三区久久久久久久久 | 亚洲精品日韩在线 | 国产精品区二区三区日本 | 黄色av网站在线观看 | www.日韩 | 色天天综合 | 日韩精品免费播放 | 综合一区二区三区 | 色偷偷人人澡人人爽人人模 | 午夜免费观看 | a在线观看| 亚洲免费视频在线观看 | 久久小视频 | 91久久 | 精品综合| 欧美中国少妇xxx性高请视频 | 欧美三级电影在线播放 | 欧美操操操 | 国产精品国产馆在线真实露脸 | 久久久欧洲 | 夜夜干夜夜操 | 日本一区二区视频 | 韩日一区二区 | 日韩日韩日韩日韩日韩日韩日韩 | 亚洲精品永久免费 | 国产一区二区三区在线看 | 精品久久久久久久人人人人传媒 | 成人av电影在线 | 精品久久久久久亚洲国产800 | 国产日韩精品视频 | 国产999精品久久久影片官网 | 91精产国品一二三区 | 国产成人精品久久二区二区 |