如何同步在线和离线数据库

8

我有一个网络应用程序,可以为我的客户提供一些信息。我有另一个版本(Windows),与web应用程序完全相同

这是因为Web连接可能会失去几个小时,在此期间用户将使用该应用程序。

我想知道如何同步这些SQL Server数据库。

请注意,Web应用程序从3个不同城市使用,并且所有这些城市都安装了基于Windows的应用程序。我该怎么办?

请注意:Windows版本与在3个不同城市的本地Web服务器上安装的Web应用程序完全相同,用户通过其局域网(LAN)访问它们。


同步是双向的还是单向的? - A G
2个回答

4

所有关于数据的更新都将从 Windows 应用程序发起,包括从/向 Web/Windows 的更新。但问题在于,当没有互联网连接时,Windows 应用程序将无法运行。

因此,您需要使用一个 Windows 服务来调用 Web 服务进行本地和远程数据库更新。Windows 可以每隔 x 分钟唤醒并更新远程和本地数据库。

Web 服务将有两种方法:

GetData(DateTime getRecordsFromThisDate) - Windows service should call this on regular intervals and update the local database.

UploadData(dataRows/collection) -  Windows service should call this on regular intervals and update the remote database.

数据库中的每个记录都会有一个时间戳。对于本地更新,获取最大的时间戳并将其作为参数发送到GetData()。Web服务将返回在此时间之后创建的记录。

对于上传数据,您需要存储上次成功上传操作运行的时间。获取此时间之后插入和更新的记录,并将它们发送到UploadData()。


2
这个解决方案会以不可预测的方式丢失一些更改 - 如果两个用户在离线状态下同时更新同一个字段,当同步发生时,他们的更改中的一个将被覆盖。建议使用诸如Microsoft Sync Framework之类的同步库,而不是编写自己的库。 - Sam Johnson

1

你的选择可能是使用数据库备份进行同步(可能非常缓慢和不切实际)。之后,你必须使用ETL。选择你喜欢的工具。你可以使用SQL Server CDC或我建议使用Change Tracking来识别你的更改并仅加载这些更改。然后使用合并来同步你的更改。当然,这些解决方案将要求你设置链接服务器或使用第三方临时保存DML更改。

http://technet.microsoft.com/en-us/library/bb510625.aspx

http://msdn.microsoft.com/en-us/library/cc305322.aspx

我想我会添加一个非微软的解决方案http://www.red-gate.com/products/sql-development/sql-data-compare/,虽然它不是免费的,但确实可以完全满足您的需求。

先将三个数据库同步,然后再将它们与服务器同步,这样不是更好吗?还是我应该将它们全部与服务器同步,然后使用已同步的服务器版本并将其备份发送给客户端? - Nasser Hadjloo
1
@Aseem 这些都是插入操作吗?还是你还需要考虑更新操作?如果有多个客户端更新同一条记录,很可能会遇到争用问题。这时你需要确定正确的记录。如果只涉及插入操作,那么顺序就不重要了。 - JStead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接