一、概念
unit of work:維護受業務事務影響的物件列表,並協調製化的寫入和併發問題的解決。其uml結構大致如下:
工作單元記錄在業務事務過程中對資料庫有影響的所有變化。操作結束後,作為一種結果,工作單元了解所有需要對資料庫做的改變,統一對資料庫操作。
二、為什麼要使用工作單元?
如果沒有使用工作單元,可以在每次修改物件模型時對資料庫對得相應修改,但這樣會產生大量規模很小的資料庫呼叫,從而導致速度變慢。而且這樣做還需要有乙個對整個互動過程都開放的事務,如果存在乙個貫穿多個請求的業務事務,這就是不合實際的。如果還要記錄讀過的物件以避免不致讀,那麼情況會更糟。
引發處理資料庫的原因就是變化:建立新物件和更新或刪除已經存在的物件。工作單元就是乙個記錄這些變化的物件。只要開始做一些可能會對資料庫有影響的操作,就建立乙個工作單元去記錄這些變化。每當建立、改變或者刪除乙個物件時,就通知此工作單元。也可以讓此單元知道所讀過的物件,通過驗證在整個業務事務處理過程中資料庫中的所有物件都沒有改變,從而檢查一致讀。
三、實現工作單元
在物件行為關係模式之標識對映**中加入
static function adddelete( domainobject $obj )
static function adddirty( domainobject $obj )
}static function addnew( domainobject $obj )
static function addclean(domainobject $obj ) );}
function performoperations()
foreach ( $this->new as $key=>$obj )
$this->dirty = array();
$this->new = array();
}
objectwatcher類仍然是乙個標識對映,但增加了跟蹤系統中所有物件的功能(通過$all)。
通過adddirty方法,將「髒」(就是被修改了)物件儲存在$dirty陣列中,直到更新資料庫。
通過addclean方法,把「髒」物件標識為「乾淨」的,這樣資料庫就不會更新。
通過addnew方法,將新建立的物件新增到$new陣列中,該陣列中的物件將會被插入到資料庫中。
通過performoperations方法,遍歷$dirty和$new陣列,更新或新增物件。
四、小結
工作單元解決的基本問題是記錄操作過的各種物件,以便知道為了使記憶體中的資料與資料庫同步需要考慮哪些物件。如果能夠在乙個系統事務中做完所有的工作,則只需要考慮那些改變了的物件。儘管一般來說,工作單元是解決這個問題的最好途徑,但還有其他方法。
也許最簡單的方法是,在修改任何乙個物件時就顯式地儲存該物件,但是帶來的問題是可能使用的資料庫呼叫比預想的多。如果操作過程中在三個不同的地方改變了同乙個物件,最終會產出三次資料庫呼叫,而不是一次。
要避免多重資料庫呼叫,可以把對資料庫的更新操作放在最後。為了做到這一點,需要記錄已經改變的所有物件。可以在**中用變數來實現記錄跟蹤,但是一旦變數很多,變數很快就變得難以管理。一般來說,變數與事務指令碼執行得很好,但很難與領域模型一起使用。
把每個所改變的物件加上「髒」標誌的做法要比把物件儲存在變數中好。在事務處理完後,需要找出所有加了「髒」標記的物件並把它們寫入到資料庫中。這項技術的價值取決於尋找「髒」物件的難易程式。如果所有的「髒」物件都在乙個單一層次結構上,就可以遍歷該層結構來向資料庫寫入所有被改變了的物件。然而,跨越乙個更一般的物件網路(如乙個領域模型)是比較困難的。
工作單元的強大功能是把所有的資訊儲存在乙個地方。一旦使用了工作單元,就不必為記錄所做的修改做很多操作。而且,工作單元還可以作為更複雜情況下的固定處理平台。
物件關係行為模式之標識對映
hello 架構 一 概念 二 為什麼要使用標識對映?在資料來源架構模式之資料對映器中 client venue new venue venue setname x 插入一條資料 獲取剛插入的資料 修改資料 venue setname ooooooooooo venue物件和 venueinfo物件...
企業應用架構模式之工作單元模式
工作單元模式是一種物件 關係行為模式。其定義如下 維護受業務影響的物件列表,並協調製化和併發問題的解決。該模式主要考慮的問題是 資料庫的資料讀入記憶體後的資料物件,被改變後在什麼時機提交。一般而言,可以有兩種提交方式,即時提交和擇機提交。1 即時提交 當物件改變的時候馬上提交到資料庫。這樣的好處是不...
物件導向之單例設計模式
設計模式 解決某一種問題的思想。是一種行之有效的解決方式。23種模式。單例設計模式。思想!思想!思想!解決問題 能夠保證乙個類的物件在記憶體中的唯一性。應用場景 多個成序都在操作同乙個配置檔案時,程式b需要知道程式a的結果並基於此結果進行後續操作 前提是,資料都儲存在配置檔案的物件中,要求程式a和程...