第十一天-《企業應用架構模式》-對象-關係行爲模式

1. 工作單元

用於維護受業務事務影響的對象列表,並協調變化的寫入和併發問題的解決。如下:

1)運行機制:

關鍵:

是提交時,決定要做什麼。它打開一個事務,做所有的併發檢查(使用悲觀離線鎖或樂觀離線鎖)並向數據庫寫入所做的修改。(開發人員根本不用顯示調用數據庫更新方法)

記錄對象更新的方法:

調用者註冊方式:用戶如果改變了某個對象就必須將他註冊到工作單元,任何沒有註冊的對象提交時都不會寫入數據庫。

 
      

對象註冊方式:註冊方法置於對象中,從數據庫加載對象會將加載的對象註冊爲“乾淨”的,setting方法將要設置的對象註冊爲“髒”的。

 
       

工作單元控制器:工作單元控制所有數據庫的讀操作,一旦對象被讀取,將將它註冊爲“乾淨”的對象。工作單元在讀操作時將產生一個拷貝,在提交時比較當前對象和拷貝對象(這種的辦法是指發生改變的對象),看對象是否發生了改變。

 
       

用途:數據庫(使用引用完整性時保證更新順序、批量更新)、事務資源(調整消息隊列、事務監控)

.Net環境工作單元實現:使用無連接的數據集,每一行都有版本(當前版本、原始版本、建議版本)、狀態(不變、增加、刪除、修改)概念

2)使用時機:

基本目的:記錄操作過的各種對象,以便知道爲了使內存中數據與數據庫同步需要考慮哪些對象。

2. 標識映射

通過在映射中保存每個已經加載的對象,確保每個對象只加載一次。當要訪問對象時,通過映射來查找它們。


  

1)運行機制:

鍵選擇:

數據表主鍵(或其他簡單的數據類型)

顯示的還是通用的(如findPerson(1),還是find("Person", 1)?):當所有對象鍵類型相同時使用通用的,其他情況下使用顯示的

數量(單映射、多映射):(沒看明白)

標識映射存放位置:有工作單元時,放在工作單元;沒有工作單元時,捆綁到會話的註冊表

2)使用時機:

一般來說,用一個標識映射來管理所有修改了的數據庫讀出數據;

作爲數據庫讀取操作的告訴緩存。

3. 延遲加載

一個對象,它雖然不包含所需要的所有數據,但是知道怎麼獲取這些數據

1)運行機制:

4種實現方法:

延遲初始化:

實現思想:每次訪問屬性域都要先檢查該域是否爲空。如果爲空,在返回域值之前計算出這個域的值(注意這個域需要自封裝,即便是類的內部也只能通過它來訪問)

優缺點:簡單,但往往會在對象和數據庫間強加依賴關係

適用場景:活動記錄、表數據庫入口、行數據入口

虛代理:

定義:虛代理是這樣一個對象,它看起來應該是域中的一個對象,但實際上它並不包含任何東西。只有當他的一個方法被調用時,它才從數據庫加載適當的對象

優缺點:看上去完全就是需要的對象,但並不真的是那個對象,容易陷入標識問題;同一個實對象,可能有多個不同對象特徵的虛代理(需要覆蓋Equals方法,而不用標識方法)

適用場景:數據映射器

值保持器:

實現思想:要想獲取某對象,可以訪問值保持器得到它的值,但只有第一次訪問值保持器時它才真正從數據庫讀取數據

優缺點:可避免標識問題;類需要知道值保持器的存在,喪失強數據類型顯式性;

重影:

實現思想:當從數據庫加載對象時,它只包含其ID。當每次要訪問某個域時,它就會加載其完全狀態(可以把域數據分爲不同組,按需加載)

延遲加載的問題:

繼承(虛代理、重影,需要知道要創建什麼類型的重影或虛對象);

波動加載(產生超出需要的數據庫訪問),影響應用程序性能(解決辦法:不適用延遲加載集合中的項,但集合整體可以延遲加載)

適用場景:面向方面的程序(將延遲加載置於一個單獨的方面,能獨立改變延遲加載策略)

2)使用時機:

最佳時機:需要額外的調用,並且當使用主對象時所調用的數據沒有到的時候(取決於加載一個對象時需要從數據庫讀取多少數據和數據庫調用的次數)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章