標籤:event 目的 listener deb 基本 log nim 公司 調用
之前網路上收集到的一些關於資料同步的資料
一通過發布/訂閱的方式實現同步
發布/訂閱是Sql Server內建的一種Database Backup的機制,通過該機制可以快速的實現資料的備份同步,不用編寫任何的代碼。
此種資料同步的方式存在的以下的一些問題:
- 表結構不能更改,同步雙方的表結構必須一致,一旦表結構發生更改需要重建資料庫快照集。
- 對於大資料量的同步沒有可靠的保證。
- 網路不穩定的情況下同步也不能保證。
總的來說,這種資料備份同步的方式,在表結構一致、資料量不是特別大的情況下還是非常高效的一種同步方式。
二 通過SQL JOB方式實現資料同步
通過Sql Job定時作業的方式實現同步其基本原理就是通過目標伺服器和原始伺服器的串連,然後通過編寫Sql語句,從原始伺服器中讀取資料,再更新到目標伺服器。
三 通過SQL Server Service Broker 訊息佇列的方式實現資料同步
http://www.cnblogs.com/downmoon/archive/2011/04/05/2005900.html
四 SQL Server AlwaysOn 讀寫分離 實現一主多從
缺點,無法實現多主 多從
五 基於ORM實現
這個是目前自己公司用到的方式,在程式裡面實現,使用ORM架構。
5.1如果有通過介面上操作的資料產生,必定除非ORM調用儲存方法
5.2 在儲存處增加監聽事件。把觸發的增,刪,改的sql 儲存下來
5.3使用另外一個同步資料服務,把SQL資料進行同步,達到同步資料的目的
5.4 使用的是NHinberate .在檔案 SessionImpl.cs 中的方法
IAfterTransactionCompletion 自己新增加的介面進行處理。
public override void AfterTransactionCompletion(bool success, ITransaction tx) { using (new SessionIdLoggingContext(base.SessionId)) { log.Debug("transaction completion"); if (base.Factory.Statistics.IsStatisticsEnabled) { base.Factory.StatisticsImplementor.EndTransaction(success); } this.connectionManager.AfterTransaction(); this.persistenceContext.AfterTransactionCompletion(); this.actionQueue.AfterTransactionCompletion(success); if (this.rootSession == null) { try { this.interceptor.AfterTransactionCompletion(tx); } catch (Exception exception) { log.Error("exception in interceptor afterTransactionCompletion()", exception); } } if ((tx != null) && success) // 重要 增加的代碼 { IAfterTransactionCompletionEvent[] transactionEventListeners = this.listeners.TransactionEventListeners; //該事件介面為自己定義增加 if (transactionEventListeners.Length > 0) { DbChangeAction[] dbChangeAction = this.ConnectionManager.GetDbChangeAction(); for (int i = 0; i < transactionEventListeners.Length; i = (int) (i + 1)) { transactionEventListeners[i].OnTransactionCompletion(dbChangeAction, this); } } } } }
5.5 在自己的程式中自己 實現 該介面如何處理同步資料即可
public class DataChangeListener : IAfterTransactionCompletionEvent { private static DataTable cachedDataTaskTable = null; public void OnTransactionCompletion(NHibernate.Action.DbChangeAction[] actions, NHibernate.Engine.ISessionImplementor session) { //自己定於進行處理 }/* var lstn = new DataChangeListener(); EventListeners.TransactionEventListeners = new NHibernate.Event.IAfterTransactionCompletionEvent[] { lstn };*/
六 使用 Moebius for SQL Server 資料庫的組件方式,不過這個組件需要收費
總結: 目前個人覺得最好的是 第五或者第六種方式。 還有一種方式是我個人基於第三種,和第五種想到的。 就是,在每一張表上都建立一個 增,刪,改的觸發器。 然後把變更的資料轉換成xml自動存到另外一張表中(這個表不含增刪改的觸發器,使用的是方式三的sql語句)。
然後使用程式把對應的xml語句轉換成sql語句。
再之後同步sql 語句達到同步資料的目的。
關於資料同步的幾種實現第五種基於軟體應用程式進行同步(前四種基於資料庫級,第四種做叢集一主多從。)