用於維護受業務事務影響的對象列表,並協調變化的寫入和併發問題的解決。以下:數據庫
是提交時,決定要作什麼。它打開一個事務,作全部的併發檢查(使用悲觀離線鎖或樂觀離線鎖)並向數據庫寫入所作的修改。(開發人員根本不用顯示調用數據庫更新方法)緩存
調用者註冊方式:用戶若是改變了某個對象就必須將他註冊到工做單元,任何沒有註冊的對象提交時都不會寫入數據庫。併發
對象註冊方式:註冊方法置於對象中,從數據庫加載對象會將加載的對象註冊爲「乾淨」的,setting方法將要設置的對象註冊爲「髒」的。性能
工做單元控制器:工做單元控制全部數據庫的讀操做,一旦對象被讀取,將將它註冊爲「乾淨」的對象。工做單元在讀操做時將產生一個拷貝,在提交時比較當前對象和拷貝對象(這種的辦法是指發生改變的對象),看對象是否發生了改變。3d
用途:數據庫(使用引用完整性時保證更新順序、批量更新)、事務資源(調整消息隊列、事務監控)代理
.Net環境工做單元實現:使用無鏈接的數據集,每一行都有版本(當前版本、原始版本、建議版本)、狀態(不變、增長、刪除、修改)概念cdn
基本目的:記錄操做過的各類對象,以便知道爲了使內存中數據與數據庫同步須要考慮哪些對象。對象
##2. 標識映射 經過在映射中保存每一個已經加載的對象,確保每一個對象只加載一次。當要訪問對象時,經過映射來查找它們。blog
鍵選擇:繼承
數據表主鍵(或其餘簡單的數據類型)
顯示的仍是通用的(如findPerson(1),仍是find("Person", 1)?):當全部對象鍵類型相同時使用通用的,其餘狀況下使用顯示的
數量(單映射、多映射):(沒看明白)
標識映射存放位置:有工做單元時,放在工做單元;沒有工做單元時,捆綁到會話的註冊表
通常來講,用一個標識映射來管理全部修改了的數據庫讀出數據;
做爲數據庫讀取操做的告訴緩存。
一個對象,它雖然不包含所須要的全部數據,可是知道怎麼獲取這些數據
延遲初始化:
實現思想:每次訪問屬性域都要先檢查該域是否爲空。若是爲空,在返回域值以前計算出這個域的值(注意這個域須要自封裝,即使是類的內部也只能經過它來訪問)
優缺點:簡單,但每每會在對象和數據庫間強加依賴關係
適用場景:活動記錄、表數據庫入口、行數據入口
虛代理:
定義:虛代理是這樣一個對象,它看起來應該是域中的一個對象,但實際上它並不包含任何東西。只有當他的一個方法被調用時,它才從數據庫加載適當的對象
優缺點:看上去徹底就是須要的對象,但並不真的是那個對象,容易陷入標識問題;同一個實對象,可能有多個不一樣對象特徵的虛代理(須要覆蓋Equals方法,而不用標識方法)
適用場景:數據映射器
值保持器:
實現思想:要想獲取某對象,能夠訪問值保持器獲得它的值,但只有第一次訪問值保持器時它才真正從數據庫讀取數據
優缺點:可避免標識問題;類須要知道值保持器的存在,喪失強數據類型顯式性;
重影:
實現思想:當從數據庫加載對象時,它只包含其ID。當每次要訪問某個域時,它就會加載其徹底狀態(能夠把域數據分爲不一樣組,按需加載)
延遲加載的問題:
繼承(虛代理、重影,須要知道要建立什麼類型的重影或虛對象);
波動加載(產生超出須要的數據庫訪問),影響應用程序性能(解決辦法:不適用延遲加載集合中的項,但集合總體能夠延遲加載)
適用場景:面向方面的程序(將延遲加載置於一個單獨的方面,能獨立改變延遲加載策略)
最佳時機:須要額外的調用,而且當使用主對象時所調用的數據沒有到的時候(取決於加載一個對象時須要從數據庫讀取多少數據和數據庫調用的次數)