




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
解决方案之数据同步本篇要讲的是数据库数据的同步方案,关于局域网,或者两台数据库IP可见的同步情况,这里不给出方案,因为这种情况数据库本身就提供了有很多种性能卓越的方案,看帮助文档就可以解决。本文要讲的案例是:有A,B两台或者更多的数据库服务器,分处于不同的网络,数据库IP不可见,端口不可见,现在需要 A中的 t1表 单向同步到 B中的 t1表 A中的 t2表 双向同步到 B中的 t2表 也就是AB两数据库服务器的单向同步和双向同步应该怎么做? 在internet网中必须考虑网络速度,所以应该保证传输的数据量尽量小一点再小一点。双向同步就是做两次单向同步而已,我们以从A服务器上的t1表单向同步到B服务器的t1表为例子说明同步方案。我们来看看三种方案,然后比较一下。方案一: 将A站的t1表的数据(DateTable类型)直接传送到B站的t1表; B端修改式插入t1表中,所谓修改式插入就是当不存在就insert当存在就update;(相当于mysql里面的:insert into t1 ()values() on duplicate key update 语法) 完成。(简单吧) 点评:这是最直接最粗暴也最安全的方案,但是如果同步的表数据比较多,这种方案肯定是行不通的。不过当数据量比较少时,比如说100条以内,则这种方案也凸现出了它的优点:安全,简单。所以这种方案也是有用武之地的。 方案二: 在同步源一端表中(如案例中的A站t1表)增加is_syncis_del 两个tinyint类型或者bite类型的字段; 当作Insert或者Update操作时,同时将is_sync设置成0,等待同步; 当作Delete操作时,将is_del设置成1,is_sync设置成0,而不是物理删除; 在A端查询所有is_sync=0的数据,传递到B端; B端接收到数据之后将B表中已经存在的数据作物理增删改并将成功的结果返回给A; A端收到B操作成功的结果,将is_sync=0且在返回成功中的数据设置is_sync=1,另外如果还is_del=1则物理删除。 点评:这种方案是比较常见但我觉得还不明智的方案,虽然它做到了进行细粒度的同步,但却添加了很多附加操作,如增删改操作都要更改is_sync的值,如果正好项目已经做到收尾阶段,所有的数据层已经实现了, 再要加同步的话改动就比较大了,所以这种方案优点是同步精度提高,传输的数据量减少,但对原本的增删改代码影响较大。与之相似的方案还有增加相同结构的表(称为它的待同步表),用触发器将增删改操作记录到这种待同步表中,然后按上面的流程实现的同步,那种方案也有同样的许多附加内容,如新增触发器和待同步表,也对现行系统造成增加负担和复杂度的负面影响。 方案三: 看方案三之前先介绍一下Rowversion这种字段类型,在mysql中是TIMESTAMP类型。 Long Long ago,MSDN说:“每个数据库都有一个计数器,当对数据库中包含 rowversion 列的表执行插入或更新操作时,该计数器值就会增加。此计数器是数据库行版本。这可以跟踪数据库内的相对时间,而不是时钟相关联的实际时间。一个表只能有一个 rowversion 列。每次修改或插入包含 rowversion 列的行时,就会在 rowversion 列中插入经过增量的数据库行版本值。”具体的关于Rowversion类型的说明就不详细写出来了,读者可以在msdn上搜一下。总之,这种类型的字段会更着数据库的记录自动改变,不需手工操作,利用这个特性,设计出第三种同步方案。 在同步源一端(A中的t1表)表中增加如下三个字段(以mssql字段类型为例子)row_version rowversion, - 当前版本sync_version binary(8), - 已同步版本is_del bit default 0, - 是否删除 当A中t1表进行增加或修改操作时,row_version字段的值会自动变成当前时间,而sync_version的值不会变,当做删除操作的时候,需要将is_del设置成1,而不做物理删除; 查询A中所有row_version!=sync_version的数据,传送到B端; B接收到数据之后做物理增删改,并将成功的结果返回给A; A接收到B返回的结果之后,将sync_version与row_version的值设置成相同,如果其中有is_del=1的则物理删除; 点评:这种方案我觉得是同步大表的最优方案,它只有在做删除操作的时候改成逻辑删除,其他操作不用考虑到同步的问题,对已经存在的系统影响最少,而且也是精确同步,不占用紧张的网络资源,这种方案是本篇的主角,也是我大力推荐的方案。在mysql中可以用 TIMESTAMP类型实现,mysql的表中只要含有TIMESTAMP字段(且是无默认值的),则当表有更新或增加时就会改变第一个TIMESTAMP类型字段的值为当前时间,这同样可以应用上述第三套方案。 在实际运用中,要看表的大小来选择同步方案,如果表较小则用第一种方案是最好的,如果表较大,则第三种是最佳方案。 鉴于这是一个解决方案的文章,索性把方案说到具体的技术实现层面上来。案例中的A需要将表数据传送给B,这个如何实现呢?实际中的情形通常是这两个网络都不会开放除了网站80之外的其他端口给外网调用,而且方案中都需要有一个程序每隔一段时间扫描一次数据库看是否有需要同步的数据,综合这些情况,可以很容易想到用win Service+ web Service的方式解决。而笔者推荐用win service+remoting的方式来做,据测试,使用remoting比web Service方式快78倍。不过两者都有传送包大小的限制,所以传送数据的时候最好分批此来传,一次100或者1000条,以免因为数据包超过大小而同步失败。 如果熟悉.Net的Remoting(或
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025湖北交投集团部分中层管理岗位竞聘上岗20人考前自测高频考点模拟试题及参考答案详解
- 2025广东深圳市市场监督管理局遴选第五批专业化职业化食品安全检查员(食品经营)模拟试卷附答案详解(模拟题)
- 2025国家电投所属国核电力院招聘1人笔试题库历年考点版附带答案详解
- 寺庙合作开发协议范本与寺庙项目合作协议范本8篇
- 2025北京通州投资发展有限公司公开招聘8人笔试题库历年考点版附带答案详解
- 2025中国东方航空食品投资有限公司校园招聘笔试题库历年考点版附带答案详解
- 福建省安全培训检查课件
- 禁毒安全知识培训班课件
- 2025法律规定合同范本制度
- 安置房协议赠与合同7篇
- 2025年甘肃省天水市供热有限公司招聘12人笔试历年参考题库附带答案详解
- 2025年一卷政治高考真题及答案
- 安静与智慧主题班会课件
- 云南民族大学附属高级中学2026届高三上学期联考(一)生物试卷(含答案)
- 2025至2030年中国包月视频点播行业市场竞争格局分析及投资方向研究报告
- 皮带机安全知识培训
- 零星维修工程施工组织设计方案方案
- 2025年汽车驾驶员(技师)考试试题及答案(含答案)
- 2025大连国际机场招聘25人笔试历年参考题库附带答案详解
- 2025年浙江铁塔招聘笔试备考题库(带答案详解)
- 2025年上海市(秋季)高考语文真题详解
评论
0/150
提交评论