架構設計:數據訪問層簡述

来源:https://www.cnblogs.com/it-hao/archive/2019/11/21/11908601.html
-Advertisement-
Play Games

在前面簡單描述了下服務層,SOA面向服務架構,架構設計-業務邏輯層,以及一些面向設計原則理解和軟體架構設計箴言。這篇博客我們將繼續進入我們的下一層:數據訪問層。無論你用的是什麼開發模式或者是業務模式,到最後最必須具有持久化機制,持久化到持久化介質,並能對數據進行讀取和寫入CRUD。這就是數據訪問層。 ...


在前面簡單描述了下服務層SOA面向服務架構架構設計-業務邏輯層,以及一些面向設計原則理解軟體架構設計箴言。這篇博客我們將繼續進入我們的下一層:數據訪問層。無論你用的是什麼開發模式或者是業務模式,到最後最必須具有持久化機制,持久化到持久化介質,並能對數據進行讀取和寫入CRUD。這就是數據訪問層。你可能是利用xml等文件格式磁碟存儲,常用的關係資料庫存儲,或者NoSql(not only sql)的記憶體存儲或文檔存儲等等存儲介質。而這裡我只關心關係資料庫存儲。

數據層需要提供的職責有:

1:CRUD服務。作為唯一可以與存儲介質交互的中間層出現,負責業務對象的增加,修改,刪除,載入。

2:查詢服務。這不同於CRUD中的R(read),read傾向於的單個對象,元組。而這裡的查詢針對複雜查詢,比如一個國內電商的客戶為四川的訂單。這裡會涉及倉儲層。所謂倉儲模式指的是一個提供業務對象查詢的類,他隱藏了數據查詢的解析步驟,封裝sql解析邏輯。

3:事務管理。這裡所說的是業務事務,在一個應用系統中每次請求都會產生多次的多數據對象的新增,修改,刪除操作。如果我們每次都依次代開資料庫連接,準備數據包,操作資料庫,關閉數據連接。這些將會給我們帶來很多不必要的性能開銷。資料庫管理員經常會要求“儘量少的與資料庫交互”,這也必須成為我們的開發原則。更好的操作是我們在記憶體中建立一個和數據倉庫,維護變化的對象,在業務操作完成一次性提交到數據存儲介質,提供業務事務。業務事務有個很好聽的名字工作單元(UOW),在微軟給我們提供的DataSet,orm框架都回必須存在業務事務。

4:併發處理。UOW應避免業務數據連接的多次提交打開而出現,但在記憶體離線操作,這就可能導致數據一致性問題。在多用戶的環境,對數據併發處理需要制定一個策略。一般我們會採用樂觀併發處理:用戶可以任意的離線修改,在修改更新時候檢查對象是否被修改,如果被修改者本次更新失敗。簡單的說就是防止丟失修改。防止丟失修改,我們可以採用where 加上一系列原值,或者加上修改時間戳或者版本號標記。同時還有許多其他的併發解決模式,但樂觀併發鎖用到更普遍。

5:數據上下文:整和所有職責。在數據訪問層概念職責都會有一個共同的暴露給外部的介面。我們需要一個高層次的組件,來同一提供對數據存儲介質的訪問操作。,同一訪問資料庫CRUD,事務,併發服務的高層次類,叫做數據上下文(Context)。EF中的ObjectContext,NHibernate的session,linq to sql 的DataContext等等。

數據訪問層的一些概念(這裡不會是全部,僅一些個人覺得重要的概念):

1:數據映射器:將記憶體中修改的對象提交至存儲介質,則需要要映射邏輯來完成,數據映射器就是就是一個實現將某種類型的業務對象持久化的類(數據映射器模式定義如《P of EAA》)。

2:倉儲層(Repository):在上面提到:所謂倉儲模式指的是一個提供業務對象查詢的類,他隱藏了數據查詢的解析步驟,封裝sql解析邏輯。在面向對象的世界里我們用對象進行查詢,返回結果為對象集。這裡的查詢可能是從資料庫,或者來至緩存,這取決你的策略,你倉儲層的實現。

3:工作單元(UOW):Martin Fowler《P of EAA》定義:工作單元記錄在業務事務過程中對資料庫有影響的所有變化。操作結束後,作為一種結果,工作單元瞭解所有需要對資料庫做的改變。在上面第3點業務事務講的差不多,這裡不是累述。

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

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

6:延時載入:對象並不是一次性載入完成,而是按照需求多次載入數據,到用時載入。業務對象太多關聯,數據量太多餘龐大,而我們每次業務事務需要操作的對象都只會是部分,不需要太多的數據對象。同事業務對象中還存在迴圈引用,這樣不適於對象整體的一次性載入。延時載入提供了優化,意圖在“儘可能的少載入,並按需載入,只載入需要的數據部分”。

7:持久化透明對象(PI或POCO):當對象模型不存在任何外部依賴,特別是對於數據訪問層的依賴,那麼這個模型就是持久化透明的,POCO。一個POCO的對象不需要繼承至某個特定的類,實現特定的介面,或提供專門的構造函數。一個非持久化透明的對象這以為者存在外部的依賴,而我們更喜歡領域對象只是一個簡單額c#類,可以在持久化層等獨立切換。這就導致實現的時候我們無法很直接的跟蹤業務對象,這就是面向方面編程(AOP)或者代理模式的大顯身手。可惜AOP在.net中不是那麼直接,很多ORM框架如NHibernate之類的利用代理模式Emit動態註入IL實現跟蹤,添加新的行為。所以NHibernate中要求領域對象的所有欄位屬性方法都必須是虛方法可重寫的。:

8:CQRS(Command Query Responsibility Segregation,命令查詢職責分離):CQRS是在DDD的實踐中引入CQS理論而出現的一種體繫結構模式,命令和查詢被分離。

鏈接:https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g 提取碼:x2p5

免費分享,但是X度限制嚴重,如若鏈接失效點擊鏈接或搜索加群 群號744933466


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Mapper映射文件 mapper.xml映射文件主要是用來編寫SQL語句的,以及一些結果集的映射關係的編寫,還有就是緩存的一些配置等等。 在映射文件裡面可以配置以下標簽: | 元素名稱 | 描述 | 備註 | | | | | | select | 查詢語句,最常用、最複雜的元素之一 | 可以自定義 ...
  • 介紹:大三上做一個醫學影像識別的項目,醫生在原圖上用紅筆標記病竈點,通過記錄紅色的坐標位置可以得到病竈點的外接矩形,但是後續會涉及到紅圈內的面積在外接矩形下的占比問題,有些外接矩形內有多個紅色標記,在使用網上的opencv的fillPoly填充效果非常不理想,還有類似python計算任意多邊形方法也 ...
  • 打開 File->Project Structure –> Artifacts(ctrl+alt+shift+s) ,這裡會有4個,我已經刪除了,把 ssm:war 和 ssm:war exploded 移除。然後重新啟動就可以運行了 ...
  • 環境:vmware centos7.4 2cpu 2核心 工具:ab壓力測試工具 測試對象:sso單點登錄系統 電腦:win10 4核 項目環境:flask+uwsgi+nginx(uwsgi 2進程,4線程) 1. 100個用戶,總共100個請求 測試截圖 2. 500個用戶,總共500個請求 測 ...
  • 假設需求開發一個叫做 helloWord 的擴展。擴展里有一個函數,helloWord()。 echo helloWord('Tom'); //返回:Hello World: Tom 本地環境PHP版本:5.6.9系統:Linux CentOS release 6.5 (Final) 最終效果 實現 ...
  • 1.內容介紹 深入解析tp5.1與laravel 中Facade底層原理實現 1. 什麼是Facade 2. 為什麼需要有什麼好處 3. Facade實現原理 4. 功能實現、 5. 容器註入 2.知識講解 0.什麼是Facade??為什麼需要?有什麼好處 專業解釋: 門面模式(Facade)又稱外 ...
  • Hangman 游戲簡介 百度百科 列印Hangman 其它 開始游戲 給定一個需要猜測的單詞開始游戲 def start_game(word): 已經猜錯的詞 wrong = '' 將未猜出的以 顯示 secret = hide(word) 記錄還剩多少個 ,如果為0,則為全部猜中 secret_ ...
  • 執行下麵這倆命令,找到對應的IP,增加host就能解決 nslookup github.global.ssl.fastly.Netnslookup github.com root@tao-PC:/var/www/html/go-project/test# nslookup github.global ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...