之前网络上收集到的一些关于数据同步的资料
一通过发布/订阅的方式实现同步
发布/订阅是Sql Server自带的一种数据库备份的机制,通过该机制可以快速的实现数据的备份同步,不用编写任何的代码。
此种数据同步的方式存在的以下的一些问题:
- 表结构不能更改,同步双方的表结构必须一致,一旦表结构发生更改需要重新生成数据库快照。
- 对于大数据量的同步没有可靠的保证。
- 网络不稳定的情况下同步也不能保证。
总的来说,这种数据备份同步的方式,在表结构一致、数据量不是特别大的情况下还是非常高效的一种同步方式。
二 通过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 语句达到同步数据的目的。