我使用后端数据库更新了几年的应用程序。整个关键是所有内容都缓存在客户端上,因此它永远不需要网络连接来运行,但是当它确实有连接时,它将始终获取最新的更新。更新的每个应用程序都附带最新版本的数据库,我希望它在数据库更新时只下载最少量的数据。
我目前使用带有时间戳的表来检查更新。它看起来像这样。
ID - Name - Description- Severity - LastUpdated
0 - test.exe - KnownVirus - Critical - 2009-09-11 13:38
1 - test2.exe - Firewall - None - 2009-09-12 14:38
这种方法对我之前需要的方法很好,但我希望扩展应用程序的更多功能以使用这种类型的动态方法。所有数据当前都存储为XML
,但我不想将完整的XML文件存储在数据库中,只传输更改的数据。
那么你将如何在数据库中使用一种相当简单的方法来存储动态内容(text / xml / json / xaml),并让客户端只下载新的更新?我正在考虑使用可以直接处理XML的逻辑
ID - Data - Revision
15 - XXX - 15
XXX
将类似于<Content><File>Test.dll<File/><Description>New DLL to load.</Description></Content>
并将被插入到缓存中,但这显然会很复杂,因为我需要按顺序加载它们。
已经提到的另一种方法是将其基于类似于源代码控制的东西,将版本存储在文件的根目录中并计算增量以计算出需要发送到客户端的最小数据量。
任何人都有任何关于如何处理此问题而没有数据损坏风险的建议?我还将扩展功能,允许我恢复可能不好的修订,并用新的工作替换它们。
答案 0 :(得分:4)
我会使用Sync Framework来解决问题。
微软引用:
Microsoft Sync Framework是一个全面的同步平台,可实现应用程序,服务和设备的协作和脱机。开发人员可以构建同步生态系统,通过任何网络上的任何协议集成任何应用程序,来自任何商店的任何数据。 Sync Framework具有支持漫游,共享和脱机数据的技术和工具。
Sync Framework的一个关键方面是能够创建自定义提供程序。提供程序允许任何数据源参与Sync Framework同步过程,从而允许发生对等同步。
答案 1 :(得分:4)
这实际上取决于您使用的工具和您已有的架构。是否已有一个具有某些逻辑和数据访问层的服务器?
动态方法可能会变得复杂,缓慢并限制解决方案的数量。为什么需要动态结构?通过在关系数据库中使用名称 - 值对方法来添加数据是否可行?静态和统一的数据结构更容易处理。
在详细介绍之前,您应该考虑不同的场景。
添加不是一个大问题。客户端需要记住它从服务器获得的最后一个修订版号,然后编写一个查询,从那里获取所有内容。
变化基本相同。你应该关心物品的识别。您需要一个不可更改的代理键,因为它似乎是您已有的ID。 (Guids在这里可能很有用。)
删除很棘手。您需要将项目标记为已删除而不是实际删除它们,或者删除已删除ID的列表以及删除后的修订号。
将数据存储在客户端中:考虑在客户端中使用SQLite等关系数据库。 (它不需要安装,它只是存储在一个文件中。例如,Firefox在SQLite数据库中存储了很多。)在服务器中使用它时,你可以重用一些代码。它也是基于事务的,有助于保持一致(在同步期间出现错误时回滚)。
XML - 如果你真的需要它 - 可以像数据库中的字符串一样存储。
当使用支持SQLite的抽象层或ORM(例如NHibernate)时,即使服务器使用了另一个数据库,您也可以重用某些代码。请注意,这种ORM的学习曲线可能相当陡峭。如果你不知道这样的话,可能会太多。
您无需在客户端和服务器中强制重用代码。
同步本身不应该非常复杂。您在客户端中有一个修订号,在服务器中有最后一个修订版。从那时起,您将在客户端中获取所有新的/已更改和已删除的项目,并将其应用于本地存储。更新本地修订号。承诺。完成。
我永远不会只更新修订的一部分,因为那时你无法真正知道自上次同步以来发生了什么变化。因为您进行差异更新,所以必须具有良好定义的客户端状态。
答案 2 :(得分:4)
我刚刚完成了你所描述的应用程序。我在DjSol提到的Microsoft Sync Framework之上构建它。
我使用带有SqlCe数据库的C#前端应用程序,另一端使用SQL 2005 Server。
以下文章对我非常有用:
Tutorial: Synchronizing SQL Server and SQL Server Compact
Walkthrough: Creating a Sync service
Step by step N-tier configuration of Sync services for ADO.NET 2.0
答案 3 :(得分:2)
您没有说明您的后端数据库是什么,但如果它是SQL Server,您可以使用SqlCE(SQL Server Compact Edition)作为客户端数据库,然后使用RDA合并复制来根据需要更新客户端数据库。这将确保满足您的所有要求;没有必要为了这样一个共同的要求重新发明轮子。