關於數據同步的幾種實現第五種基於軟件應用程序進行同步(前四種基於數據庫級,第四種作集羣一主多從。)

以前網絡上收集到的一些關於數據同步的資料html

一經過發佈/訂閱的方式實現同步sql

發佈/訂閱是Sql Server自帶的一種數據庫備份的機制,經過該機制能夠快速的實現數據的備份同步,不用編寫任何的代碼。數據庫

此種數據同步的方式存在的如下的一些問題:服務器

  1. 表結構不能更改,同步雙方的表結構必須一致,一旦表結構發生更改須要從新生成數據庫快照。
  2. 對於大數據量的同步沒有可靠的保證。
  3. 網絡不穩定的狀況下同步也不能保證。

總的來講,這種數據備份同步的方式,在表結構一致、數據量不是特別大的狀況下仍是很是高效的一種同步方式。網絡

 

二   經過SQL JOB方式實現數據同步session

經過Sql Job定時做業的方式實現同步其基本原理就是經過目標服務器和源服務器的鏈接,而後經過編寫Sql語句,從源服務器中讀取數據,再更新到目標服務器。框架

 

 

三   經過SQL Server Service Broker 消息隊列的方式實現數據同步ide

 http://www.cnblogs.com/downmoon/archive/2011/04/05/2005900.html大數據

 

四    SQL Server AlwaysOn   讀寫分離 實現一主多從 this

  缺點,沒法實現多主 多從

五    基於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 語句達到同步數據的目的。
相關文章
相關標籤/搜索