Just do it!

去想,去做,去努力,去奋斗,自己的未来是由自己改变的.
posts - 98, comments - 565, trackbacks - 26, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

话说微软刚出的同步框架Sync Services

Posted on 2008-05-07 08:45 JustDI 阅读(3295) 评论(41)  编辑 收藏 网摘 所属分类: windows Mobile
前言:

     Sync Services For ADO.NET 这个版本的同步框架已经出来好久了,现在已经是CTP2的版本了,但它一直都是只针对桌面应用,没有针对移动设备。但3月份的时候针对移动应用的这个版本 终于出来,不过现在也还仅仅是CTP版本。心急的你一定想知道它到底是何方神圣?如果您还在苦苦寻找windows mobile数据同步解决方案,那么本文可做为您的一个参考。

     如果有做过Windows mobile数据同步的应该都知道微软在起初提供了两个方案供我们选择,一个是RDA,另个是Merge Replication(合并复制),它们的原理都一样,在IIS上注册一个服务器数据同步的dll,我们也叫它Server Tools服务器端数据同步提供程序,用它做为客户端与服务器数据库的中间层。但是在做移动应用开发的时候希望你能注意到移动CMWAP网关的限制,详情 请见我看windows mobile数据同步方案

    庆幸地是微软推出的这个新的同步解决方案Sync Services,它能弥补RDA和Merge Replication所带来的不足,极大地解决了我们的燃眉之急。下面就为您详细地概述这个平台。您也可以在下面这个地址下载到它。

    Sync Services For ADO.NET(只有454KB)
     联机丛书

正文:

     Microsoft Synchronization Services for ADO.NET 提供了一个直观且灵活的API,这个API提供了一组用于在数据服务和本地存储区之间的数据同步,Synchornization Services API是以ADO.NET数据访问的API为蓝本,提供了一种直观的数据服务手段。下面的摘自MSDN的几种同步技术的对比或许能更直观地看到它到底能做 什么?

主要对比
RDA  合并复制
Synchornization  Services
使用服务进行同步



支持异类数据库



跟踪增量更改



冲突检测与解决



在客户端轻松建立视图



自动初始化架构和数据



支持大型数据集



可在本地使用查询分析器



自动传播架构更改



在设备上使用




     我想合并复制是针对数据库管理员的,Synchornization Services是针对开发人员的,因为与合并复制比起来,它必须编写更多的应用程序代码,下面的这张图是Synchornization Services的N层同步体系结构,对应的还有双层同步结构,但那只是适合使用在桌面应用程序上。一图胜万言,相信下面的这张图加上注释一定能让您对 Sync Services有个大概的框框。

    
概念解释:

 1.客户端数据库:
    一般我们使用SQL Server Compact 3.5 做为移动客户端同步数据库,它内置了对Sync Services的支持,包含了Microsoft.Synchronization.Data和 Microsoft.Synchronization.Data.SqlServerCe两个组件。因此我们就不用在CAB安装包中包含它们了。

2.服务器数据库
服务器数据库就没有什么限制了,只要能够对其使用ADO.NET的数据库都可以拿来做服务器数据库。

3.同步代理
同步代理通过以下方式驱动同步过程:
1)循环遍历要同步的每个表;
2)调用客户端同步提供程序以检索和应用客户端数据库的更改;
3)调用服务器同步提供程序以检索和应用服务器数据库中的更改。

4.客户端同步提供程序
Sync Services包含了一个用于SQL Server Compact3.5数据库的提供程序,它的主要功能有:
1)储存与客户端上支持同步的表的有关的信息;
2)检索自上次同步以来在客户端数据库中发生的更改;
3)将增量更改应用于客户端数据库;
4)检测发生冲突的更改。

5.服务器同步提供程序
服务器同步提供程序与服务器通信,并将同步代理与服务器数据库的特定实现屏蔽开来,服务器同步提供程序的主要功能有:
1)存储与服务器上支持同步的表的相关的信息;
2)使应用程序能够检索自上次同步以来在服务器中发生的更改;
3)将增量更改应用于服务器数据库;
4)检测发生冲突的更改。

6.同步适配器
同步适配器就像ADO.NET的适配器一样,它为每一个客户端请求同步的表均定义一个适配器,同步适配器为服务器同步提供程序提供了与服务器数据库交互所需的特定命令,例如InsertCommand(用于将客户端新增的数据插入服务器端)。

7.代理、服务和传输
在N 层应用程序中,使用的是Microsoft.Synchronization.Data.Server.dll,但是它不驻留在客户端上(假如是两层应用 程序的话,那么它才跟客户端应用程序一起),通常,DLL驻留在直接连接到服务器数据库的一个中间层上。在这种情况下,为了实现客户端和中间层之间的通 信,代理和服务是必须的:
1)在客户端上,应用程序代码引用服务器同步提供程序的一个代理(ServerSyncProviderProxy),而不是直接引用提供程序,该代理与位于中间层的服务进行通信;
2)在中间层,该服务继承ServerSyncProvider,并公开与其相同的方法。然后,通过与服务器数据库的直接连接执行服务器同步提供程序的方法,结果通过中间层发送回客户端。

死嚼概念,未免生涩难咽,举一小例子希望能让您胃口大开。

示例:

     在Sync Services中,同步代理类为SyncAgent,它的作用就如上图所示的同步代理,在这个例子中我们使用webservice做为我们的中间传输层。

public class SampleSyncAgent:SyncAgent
{
    
public void SampleSyncAgent()
    
{
        
//定义客户端同步提供程序
        this.LocalProvider= new
SqlCeClientSyncProvider(连接客户端数据库的连接字符串);
        
//定义服务器端同步提供程序
        this.RemoteProvider=new
ServerSyncProviderProxy(webservice);
    }

}

SampleClientSyncProvider就是我们图中所示的客户端同步提供程序,ServerSyncProviderProxy是服务器同步提供程序的一个代理,如图中所示,假如ServerSyncProviderProxy中的webservice编码并部署好了,我们直接调用这个同步代理类的同步方法就可以了,如下面所示:

new SampleSyncAgent().Synchronize()

 当然上面简单的调用还不行,我们还必须指定我们所需要同步的表
    public void SampleSyncAgent()
    
{
        
//定义客户端同步提供程序
        this.LocalProvider= new SqlCeClientSyncProvider(连接客户端数据库的连接字符串);
        
//定义服务器端同步提供程序
        this.RemoteProvider=new ServerSyncProviderProxy(webservice);
        
//注意哦,表名必须与服务器同步提供程序指定的表名一致,区分大小写
        SyncTable MySyncTable=new SyncTable("表名")
        
//设置表的创建方式,这里为不存在的话就创建,已存在的话就上传已存在的表里的所有行    MySyncTable.CreationOption=TableCreationOption.UploadExistingOrCreateNewTable;
        
//设置表的同步方式,这里为只下载       
         MySyncTable.SyncDirection=SyncDirection.DownloadOnly;
         this.Configuration.SyncTables.Add(MySyncTable);
    }
    
      这样的话我们就指定了一张客户端需同步的表,服务器同步提供程序要做什么呢,简单地说webservice必须实现四个方法才可以正常地去同步客户端与服务器端的数据。

1.ApplyChanges:将把同步表中的数据插入、更新和删除应用到服务器数据库。
2.GetChanges:从服务器数据存储区中选择要在客户端存储区应用的同步组中每个表的数据增量插入、更新和删除。
3.GetSchema:从服务器数据库中检索一或多个表的架构。
4.GetServerInfo:获取服务器同步信息

具体代码如下:
method

最后我们只需提供在webservice 中实现同步适配器就可以与我们的客户端进行同步交互了。
      //Service是指webservice
        public Service()
        
{
             这里是定义同步适配器
        }

     这个小例子主要还是为了解释整个的Sync Service的N层体系结构,如果初次接触的兄弟也不必去深入地研究代码,只有明白了整个的体系结构才能更好地理解代码,实现或扩展它,文中的代码均为伪代码,限于文章的篇幅,未能够详细地论述如何去实现同步,数据的筛选,冲突解决机制等等,以后的随笔会详细地讲解到,个人接触这个框架的时间也不长,因此文章难免错误,欢迎大家拍砖。因为项目中已经应用到了这个框架,因此以后接触它的几率会很频繁,希望以后能在这里与大家共同讨论它的使用心得。

Feedback

#1楼   回复  引用  查看    

2008-05-07 09:17 by 天真的好蓝啊      
沙发~~~

#2楼   回复  引用  查看    

2008-05-07 09:19 by 蓝星空      
如果服务器上的数据库采用的是ACCESS,或者用的是XML来存储数据的话,也能很好的同步吗?

#3楼   回复  引用  查看    

2008-05-07 09:20 by 蓝星空      
这么快就到2楼了!

1楼的还我沙发!

#4楼[楼主]   回复  引用  查看    

2008-05-07 09:25 by JustDI      
@蓝星空
这个我还没有去尝试过,不过能支持ADO.NET的应该都可以,XML可能不行,因为不能在其列上定义一个时间戳,这样的话就没法去具体查找同步的定位点。
ACCESS的话你可以尝试一下。

#5楼   回复  引用  查看    

2008-05-07 09:35 by 啊黄      
很清晰讲解了同步框架Sync Services,学习。

#6楼   回复  引用  查看    

2008-05-07 09:55 by 高海东      
写的好

#7楼   回复  引用  查看    

2008-05-07 10:01 by 镜涛      
没学mobile,顶一个把!

#8楼[楼主]   回复  引用  查看    

2008-05-07 10:28 by JustDI      
@啊黄
@高海东
@镜涛
谢谢支持:)

#9楼   回复  引用  查看    

2008-05-07 10:52 by micYng      
刚开始还以为是ActiveSync :D

#10楼   回复  引用  查看    

2008-05-07 10:56 by SZW      
这样的文章看起来舒服

#11楼   回复  引用  查看    

2008-05-07 11:18 by 生鱼片      
学习

#12楼[楼主]   回复  引用  查看    

2008-05-07 11:27 by JustDI      
@micYng
嘿嘿,貌似都是同步:)

#13楼[楼主]   回复  引用  查看    

2008-05-07 11:31 by JustDI      
@SZW
虽然会多花一点时间,但是我愿意做这种排版的事,还好是B/S出身,不是很费劲。

在整个软件体系中,UI层也是占有很重的比例的哦。

#14楼[楼主]   回复  引用  查看    

2008-05-07 11:32 by JustDI      
@生鱼片
嘿嘿,一起学习,这个框架还有好多功能值得我们去挖掘。

#15楼   回复  引用  查看    

2008-05-07 12:46 by 求知无傲      
我也来

#16楼   回复  引用  查看    

2008-05-07 14:13 by Async Liu      

这个同步框架目前好像只支持SQL SERVER CE到SQL SERVER之间的同步,如果是其他异构数据源的话,就要针对不同的数据源自己去写同步驱动。

我前段时间做Oracle远程数据同步的时候恰巧看到了这个东东,当时了解不多,还想在这个BETA的框架上自己写Oracle同步的驱动呢(-_-),现在想起来很有意思。

#17楼[楼主]   回复  引用  查看    

2008-05-07 14:31 by JustDI      
@Async Liu
我没尝试过其他的数据库,但是我觉得Oracle也是可以的,因为其支持ADO.NET,SQL SERVER 也是需要自己写中间层和服务器同步提供程序,或许你可以尝试一下。因为微软让Sync Service支持移动设备也是让我们在数据同步方案上多个选择,而它跟合并复制比起来就有个支持多种数据源的优点,这些只是个人观点,希望能给你一点参考。

#18楼   回复  引用    

2008-05-07 16:23 by aubb[未注册用户]
赞一个.....

#19楼   回复  引用  查看    

2008-05-07 18:00 by jillzhang      
http://www.cnblogs.com/jillzhang/archive/2008/01/20/1045934.html" target="_new">http://www.cnblogs.com/jillzhang/archive/2008/01/20/1045934.html

#20楼   回复  引用  查看    

2008-05-07 18:10 by G yc {Son of VB.NET}      
楼主厉害,已经开始翻译了

回复楼上的,
这个东西使用provider 来同步, 默认提供了几个, (SQL的应该有了, 并且会被集成到 SQL Sever 2008 中)

如果没有的话,就需要自己写了
自定义Provider后,就可以实现任意数据源的同步

#21楼[楼主]   回复  引用  查看    

2008-05-07 19:47 by JustDI      
@jillzhang
:(,不是特别懂。

#22楼[楼主]   回复  引用  查看    

2008-05-07 19:49 by JustDI      
@G yc {Son of VB.NET}
项目需要,人的潜力有时候也是被逼出来的:)

provider包括客户端的和服务器端的,N层体系结构里是通过中间层来通信的。

#23楼   回复  引用  查看    

2008-05-07 21:12 by micenter      
不错,哥顶你。
期待下一篇的到来。。。

#24楼[楼主]   回复  引用  查看    

2008-05-07 21:46 by JustDI      
@micenter
:)

#25楼   回复  引用  查看    

2008-05-07 21:49 by G yc {Son of VB.NET}      
哦,潜力啊~~


我在想怎么挖掘呢~

留下我的Email Guanyc#Gmail .com
我也在学习,以后多交流啊(因为也做客户端程序^_^)

#26楼[楼主]   回复  引用  查看    

2008-05-07 21:52 by JustDI      
@G yc {Son of VB.NET
呵呵,好的。

#27楼   回复  引用  查看    

2008-05-07 22:18 by tatung zhang      
好文,支持 ....

#28楼[楼主]   回复  引用  查看    

2008-05-08 08:00 by JustDI      
@tatung zhang
:)

#29楼   回复  引用  查看    

2008-05-08 10:51 by 李战      
http://www.cnblogs.com/Emoticons/qface/055242240.gif" alt="" />学习了!

俺觉得不管啥数据同步框架,同步的粒度不应该是一条条的表记录,而应该是一笔笔的业务记录,这个才是用好数据同步复制框架的关键。http://www.cnblogs.com/Emoticons/QQ/laf.gif" alt="" />

一笔业务记录可能对应多个表的多条表记录,业务记录在一次同步过程中必须保持完整。咱们总不能将一份订单复制一半到异地数据库,而另一半因为网络不通,丢了。

因此,设计数据同步复制的应用,需要从业务上设计事务的粒度,而不是考虑表记录的同步。

俺是瞎猜的,说错了就拿砖头砸我好了。http://www.cnblogs.com/Emoticons/others/welcome.gif" alt="" />

#30楼[楼主]   回复  引用  查看    

2008-05-08 13:51 by JustDI      
@李战
关于这些事务处理,我想微软的大大们应该帮我们考虑得很全面了,我们所需要处理的还是关于业务逻辑这方面的。

#31楼   回复  引用  查看    

2008-05-08 21:27 by G yc {Son of VB.NET}      
@李战

Sync Services 使用的是provider同步的, 支持,单向和双向同步。
虽然我没有看 ADO.NET版本的,不过VS2008 里已经有了一个初期版本(SQL的) 机制是一样的


对于你说的,也可以说是也可以说否,
怎么说呢,如果你把 同步的ITEM 看成一个业务(即一组数据)那么你说的应该是对的, 但 反过来, 如果我同步的是一个记录,也可以,因为使用了Cache(本地缓存),换句话说,是对你访问过的信息,进行记录。(可以看看IE,如果 是按网站级别缓存的,我估计现在的硬盘都爆了^_^)

之后后边那个,应该说有2中形式
1、数据失效, 已经下载将被删除掉
2、数据缓存,但不应用,等待下次网络恢复时继续


#32楼   回复  引用  查看    

2008-05-13 14:26 by 数据绑定者      
这种同步如果在两个Sql中间要怎样操作?效率怎么样?

#33楼[楼主]   回复  引用  查看    

2008-05-13 14:42 by JustDI      
@数据绑定者
两个sql之间建议使用合并复制,用Sync Service只适合于客户端为SQL Compact Edtion 3.5.

#34楼   回复  引用  查看    

2008-05-13 18:50 by G yc {Son of VB.NET}      
@数据绑定者

Sync Services 是为客户端准备的, 主要是为了提供离线支持
也有说法叫做, 偶尔链接的智能客户端

如果是要SQL服务器进行同步的话, 可以应该使用SQL里的功能
比如,将其他服务器设置成映像,等

至于,同步的时候,需要使用 元数据(metadata), 这个元数据可以自定义保存位置
不过对于这个已经成型的 For ADO.NET 估计就是 SQL Compact Edtion 3.5. 了

#35楼[楼主]   回复  引用  查看    

2008-05-13 19:30 by JustDI      
@G yc {Son of VB.NET}
:)

#36楼   回复  引用  查看    

2008-09-02 15:24 by 雨过流痕      
说了半天,我还是没有看懂是如何实现,我的智能设备时断时连得时候如何知道服务器端的数据已经更新,谁来出发我手机端数据库的更新呀!

#37楼   回复  引用  查看    

2008-09-02 15:26 by 雨过流痕      
是类似手机短信那样吗,如果网络连通的时候触发本地数据库去同步服务器端数据库!

#38楼[楼主]   回复  引用  查看    

2008-09-04 10:55 by JustDI      
@雨过流痕
这篇文章只是介绍性的,具体的实现方式总的来说不是一个篇幅能讲的完的。要想知道服务器端数据的更新只能在手机端来触发,如果想让服务器端的更新自动触发到手机上面来得用PUSHMAIL,PushMail就是类似短信那样子的。

#39楼   回复  引用    

2008-09-22 17:48 by 阿兵[未注册用户]
@楼主
服务器端 DB 能否根据条件 检索出数据与 sqlce 同步

#40楼   回复  引用  查看    

2008-09-23 08:18 by G yc {Son of VB.NET}      
阿兵,理论上可以,不过可能需要自定义 Provider 才可以实现

#41楼[楼主]   回复  引用  查看    

2008-09-23 08:30 by JustDI      
@阿兵
@G yc {Son of VB.NET}
可以的,服务端可以定义参数用于过滤数据的。



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1184085




相关文章:

相关链接: