iT邦幫忙

DAY 28
2

一般對於資料批次處理,皆著重於如何提昇『新增』效率,但是在 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 則提供另一個方法,協助開發者以資料分頁取回的方式進行,提供資料選取條件與回傳每頁筆數,EntityEnumerator 類別可以簡化程式開發時間,由於 EntityEnumerator 實作 IEnumerator 介面,可以很方便地以 MoveNext 方法確認是否還有資料,以 Current 屬性取得目前回傳頁的資料集合,詳細請看下面範例:

鐵人賽分享列表:Kuick Application & ORM Framework
開放原始碼專案:kuick.codeplex.com
直接下載原始碼:Kuick
下載相關文件檔:C# Code Conventions and Design Guideline
相關教學影片區:Kuick on YouTube


上一篇
Kuick -- 遮斷器 Interceptor
下一篇
Kuick -- 更新開放原始檔
系列文
Kuick Application & ORM Framework34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言