距离上篇博客似乎又过了一段日子了,这段日子应该算是挣扎着过来的,从寻找同步错误的过程到使用新的解决方案,总共花了近3个星期,我想自己有必要总结下这次的经历。
项目是使用C#+VS2008开发的,客户端数据存储采用SQL SERVER Compact Edtion 3.5,主要想应用在windows mobile 5.0操作系统及以上的手机。对于客户端和服务器端的数据同步,最初我们讨论了好几种方式,主要包括RDA,合并复制,webservice写XML文件或SQLCE。RDA使用起来虽然简单、灵活,但因为其没有冲突处理机制及跟踪增量更改于是被第一个放弃.webservice写XML文件或SQLCE,我们粗粗估算了下,除了要另外建表外,没有个几千行代码就搞不定的,这又背离了我们开速开发的宗旨。而且我们也无法保障使用webservice写XML的效率。因此我们选择了代码量少,配置繁琐的合并复制。
程序的开发用了大约一个月左右,模拟器上调试均OK,将serverTool公开到外网,但发布到手机上了才出现A request to send data to the computer running IIS has failed的错误,因为那时候正准备将开发的结果展示给领导看,但这个错误却是意料之外的,这个错误是指示数据连接超时,当然了数据连接超时的原因有很多,而查找这个原因的过程更是让人抓狂。起先还以为是网络连接超时造成的,遂将数据删除得只剩一条,但还是出现错误。于是将原因归咎到了IIS访问用户的权限,于是乎又将快照及复制及虚拟目录的权限均设置成最高。还是出错。最后将原因归到了合并复制的配置过程上了,于是重新配置了遍合并复制,还是这个错误。没辙了,中间还使用过RDA来进行数据同步,但到了手机上还是这个错误。后来一个同事将手机连接到家里的网络,随意地点了下程序,发现可以。于是终于发现错误的源头在CMWAP的代理上网方式上。
百度了下GPRS网络,发现中国移动提供了两种上网方式,一种是CMWAP的上网方式,采用10.0.0.172:80代理服务器,这种上网方式有些限制,首先,只有满足以下两个条件的应用才能在中国移动的cmwap接入方式下正常工作1、应用程序的网络请求基于http协议;2、应用程序支持http代理协议或wap网关协议。还有种是CMNET,这种方式没有任何限制,与我们普通的PC机上网一样,可以随意地访问各类型的网站,但这种方式的缺点是上网贼贵,在我们这边是20元50M每个月,超过了按3分/K算,如果没有超过还好说,假如超过了。。。假如一首歌是4M,那么额外的你就得支付4*30=120元,汗呀..看来不能强求我们的用户使用这种方式上网了。我们只能寻求另外的解决方案。
不知道有没有其他朋友使用合并复制成功地同步过数据,忘了加一个条件就是使用CMWAP上网方式。至少我失败了,在各大论坛发帖求助,及疯狂地向国内知名的windowmobile专家发送邮件,甚至我的同事还将问题翻译成英文发送给window mobile小组,但均得不到满意的答案,这里我也感觉到了windows mobile移动应用在国内实在是太少,或许是局限于国内的移动网络。
希望这篇文章能给同样遇到此问题的您带来一点帮助。好在我们现在寻找到了我们的替代方案,就是使用微软最近才推出的Sync Service,因为是使用WebService做代理中间层,因此CMWAP的限制解决了。以后的文章中会介绍关于这个框架的使用心得,感觉速度还可以接受,第一次同步时(包括表结构及)花了35s,普通的同步12~13s之间,当然,这个数据只是针对的,在不同的手机和网络条件下不一样,仅做参考。
ps:这么看似乎前面的合并复制的翻译白写了,其实不然,因为我们的同步方案并不一定使用移动的网络,比如说桌面应用程序,具体还是要看应用了。
前言:
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.客户端数据库:
2.服务器数据库
3.同步代理
( 1 )循环遍历要同步的每个表;
( 2 )调用客户端同步提供程序以检索和应用客户端数据库的更改;
( 3 )调用服务器同步提供程序以检索和应用服务器数据库中的更改。
4.客户端同步提供程序
( 1 )储存与客户端上支持同步的表的有关的信息;
( 2 )检索自上次同步以来在客户端数据库中发生的更改;
( 3 )将增量更改应用于客户端数据库;
( 4 )检测发生冲突的更改。
5.服务器同步提供程序
( 1 )存储与服务器上支持同步的表的相关的信息;
( 2 )使应用程序能够检索自上次同步以来在服务器中发生的更改;
( 3 )将增量更改应用于服务器数据库;
( 4 )检测发生冲突的更改。
6.同步适配器
7.代理、服务和传输
( 1 )在客户端上,应用程序代码引用服务器同步提供程序的一个代理(ServerSyncProviderProxy),而不是直接引用提供程序,该代理与位于中间层的服务进行通信;
( 2 )在中间层,该服务继承ServerSyncProvider,并公开与其相同的方法。然后,通过与服务器数据库的直接连接执行服务器同步提供程序的方法,结果通过中间层发送回客户端。
死嚼概念,未免生涩难咽,举一小例子希望能让您胃口大开。
示例:
在Sync Services中,同步代理类为SyncAgent,它的作用就如上图所示的同步代理,在这个例子中我们使用webservice做为我们的中间传输层。
{
public void SampleSyncAgent()
{
//定义客户端同步提供程序
this.LocalProvider= new SqlCeClientSyncProvider (连接客户端数据库的连接字符串);
//定义服务器端同步提供程序
this.RemoteProvider=new ServerSyncProviderProxy (webservice);
}
}
SampleClientSyncProvider就是我们图中所示的客户端同步提供程序,ServerSyncProviderProxy是服务器同步提供程序的一个代理,如图中所示,假如ServerSyncProviderProxy中的webservice编码并部署好了,我们直接调用这个同步代理类的同步方法就可以了,如下面所示:
当然上面简单的调用还不行,我们还必须指定我们所需要同步的表
{
//定义客户端同步提供程序
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必须实现四个方法才可以正常地去同步客户端与服务器端的数据。
2 .GetChanges:从服务器数据存储区中选择要在客户端存储区应用的同步组中每个表的数据增量插入、更新和删除。
3 .GetSchema:从服务器数据库中检索一或多个表的架构。
4 .GetServerInfo:获取服务器同步信息
具体代码如下:
最后我们只需提供在webservice 中实现同步适配器就可以与我们的客户端进行同步交互了。
public Service()
{
这里是定义同步适配器
}
这个小例子主要还是为了解释整个的Sync Service的N层体系结构,如果初次接触的兄弟也不必去深入地研究代码,只有明白了整个的体系结构才能更好地理解代码,实现或扩展它,文中的代码均为伪代码,限于文章的篇幅,未能够详细地论述如何去实现同步,数据的筛选,冲突解决机制等等,以后的随笔会详细地讲解到,个人接触这个框架的时间也不长,因此文章难免错误,欢迎大家拍砖。因为项目中已经应用到了这个框架,因此以后接触它的几率会很频繁,希望以后能在这里与大家共同讨论它的使用心得。