關於資料同步的幾種實現第五種基於軟體應用程式進行同步(前四種基於資料庫級,第四種做叢集一主多從。)

來源:互聯網
上載者:User

標籤:event   目的   listener   deb   基本   log   nim   公司   調用   

之前網路上收集到的一些關於資料同步的資料

一通過發布/訂閱的方式實現同步

發布/訂閱是Sql Server內建的一種Database Backup的機制,通過該機制可以快速的實現資料的備份同步,不用編寫任何的代碼。

此種資料同步的方式存在的以下的一些問題:

  1. 表結構不能更改,同步雙方的表結構必須一致,一旦表結構發生更改需要重建資料庫快照集。
  2. 對於大資料量的同步沒有可靠的保證。
  3. 網路不穩定的情況下同步也不能保證。

總的來說,這種資料備份同步的方式,在表結構一致、資料量不是特別大的情況下還是非常高效的一種同步方式。

 

二   通過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 語句達到同步資料的目的。

 

關於資料同步的幾種實現第五種基於軟體應用程式進行同步(前四種基於資料庫級,第四種做叢集一主多從。)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.