一般對於資料批次處理,皆著重於如何提昇『新增』效率,但是在 ORM 架構下因為事件機制而衍生出批次『修改』、『刪除』資料一致性議題,以及當需要對百萬筆資料一筆一筆分別處理時,也產生出如何選取的問題。
批次處理分成 3 個處理內容說明:
<新增>
批次新增處理著重於效能,目前 Kuick 已經著手規畫實作這部份的功能,預計包含在第 2 版本裡,下面僅列出不同資料庫針對如何提昇批次新增效能的建議。
MSSql
System.Data.SqlClient.SqlBulkCopy 類別
BULK INSERT (Transact-SQL)
Oracle
Features of Oracle Data Provider for .NET: Array Binding
ODP.NET: Put Your Arrays in a Bind
MySQL
Speed of INSERT Statements
<修改、刪除>
在 ORM 架構下因為有事件觸發機制,衍生出批次『修改』、『刪除』資料導致事件觸發停止或延遲,造成資料邏輯的錯誤,所以,在批次修改、刪除時,面對到的是資料一致性問題。目前 Kuick 對於批次修改與刪除的實作內容是,先判定是否存在修改前後事件,或是刪除前後事件,如果不存在,則允許批次處理,如果存在,先選出所有資料後,再一一處理。
停止批次修改或刪除的原因,來自於存在修改或刪除相關的事件,如果您不清楚 Kuick 提供那些 Entity 的事件處理,請參閱前文『Kuick -- 事件替代 Trigger』,從需求面討論,事件是該再細分成『類別事件』與『物件事件』,類別事件是指不因單一筆資料的變動而需要即刻處理的事件,物件事件是指因應每一筆資料的變動而需即刻處理的事件,所以如果不存在物件事件,批次修改或刪除應可進行,在批次處理前後,觸發對應的類別事件即可,這個功能也將包含於第 2 版本裡 。
<選取>
需求情境:
如何選取大量資料 (數百萬筆以上,可能是期末存貨盤點,或是每日帳號同步),一筆一筆分別處理。
鐵人賽分享列表:Kuick Application & ORM Framework
開放原始碼專案:kuick.codeplex.com
直接下載原始碼:Kuick
下載相關文件檔:C# Code Conventions and Design Guideline
相關教學影片區:Kuick on YouTube