3

几年来,我一直在开发一个应用程序,我使用后端数据库进行了更新。整个关键是所有内容都缓存在客户端上,因此它永远不需要网络连接来操作,但是当它确实有连接时,它总是会获取最新的更新。每个更新的应用程序都附带最新版本的数据库,我希望它在数据库更新时只下载最少量的数据。

我目前使用带有时间戳的表来检查更新。它看起来像这样。

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>并且会被插入到缓存中,但这显然会很复杂,因为我需要按顺序加载它们。

已经提到的另一种方法是基于类似于源代码控制的东西,将版本存储在文件的根目录中并计算增量以找出需要发送到客户端的最小数据量。

有人对如何在没有数据损坏风险的情况下解决此问题有任何建议吗?我还将扩展一些功能,使我能够恢复可能不好的修订,并用新的工作替代它们。

4

4 回答 4

4

我刚刚构建了一个与您描述的完全一样的应用程序。我在 DjSol 提到的 Microsoft Sync Framework 之上构建了它。

我使用带有 SqlCe 数据库的 C# 前端应用程序和另一端的 SQL 2005 Server。

以下文章对我非常有用:

教程:同步 SQL Server 和 SQL Server Compact

演练:创建同步服务

ADO.NET 2.0 同步服务的逐步 N 层配置

如何使用同步框架同步模式更改的数据库?

于 2012-11-07T04:55:41.860 回答
4

这实际上取决于您使用的工具和您已经拥有的架构。是否已经有具有某些逻辑和数据访问层的服务器?

动态方法可能会变得复杂、缓慢并限制解决方案的数量。为什么需要动态结构?在关系数据库中使用名称-值对方法仅添加数据是否可行?静态和统一的数据结构更容易处理。

在详细介绍之前,您应该考虑不同的场景。

  • 可以添加项目
  • 项目可以更改
  • 可以删除项目(我假设)

添加不是一个大问题。客户端需要记住它从服务器获得的最后一个修订号,然后您编写一个查询,从那里获取所有内容。

改变基本相同。您应该关心物品的识别。您需要一个不可更改的代理键,因为它似乎是您已经拥有的 ID。(指南在这里可能很有用。)

删除很棘手。您需要将项目标记为已删除而不是实际删除它们,或者有一个已删除 ID 的列表以及它们被删除时的修订号。

将数据存储在客户端:考虑在客户端使用 SQLite 等关系数据库。(它不需要安装,它只是存储在一个文件中。例如,Firefox 在 SQLite 数据库中存储了很多。)在服务器中使用相同的内容时,您可能可以重用一些代码。它也是基于事务的,这有助于保持一致(在同步期间发生错误时回滚)。

XML——如果你真的需要它——可以作为字符串存储在数据库中。

当使用支持 SQLite 的抽象层或 ORM(例如 NHibernate)时,即使服务器使用另一个数据库,您也可以重用一些代码。请注意,这种 ORM 的学习曲线可能相当陡峭。如果你不知道这样的事情,那可能太多了。

您不需要强制重用客户端和服务器中的代码。

同步本身不应该很复杂。您在客户端有一个修订号,在服务器中有一个最新修订。从那时起,您将在客户端中获得所有新的/更改的和删除的项目并将其应用到本地商店。更新本地修订号。犯罪。完毕。

我永远不会只更新修订的一部分,因为那样你就无法真正知道自上次同步以来发生了什么变化。因为您执行差异更新,所以必须有一个明确定义的客户端状态。

于 2012-11-06T07:38:42.243 回答
4

我会选择使用Sync Framework的解决方案。

来自微软的报价:

Microsoft Sync Framework 是一个全面的同步平台,支持应用程序、服务和设备的协作和离线。开发人员可以构建同步生态系统,通过任何网络使用任何协议集成任何应用程序、来自任何商店的任何数据。Sync Framework 具有支持漫游、共享和脱机数据的技术和工具。

Sync Framework 的一个关键方面是能够创建自定义提供程序。提供程序使任何数据源都可以参与 Sync Framework 同步过程,从而实现对等同步。

于 2012-10-31T13:50:57.563 回答
2

你没有说你的后端数据库是什么,但如果它是 SQL Server,你可以使用 SqlCE(SQL Server Compact Edition)作为客户端数据库,然后使用 RDA 合并复制来根据需要更新客户端数据库。这肯定会满足您的所有要求;对于这样一个常见的要求,没有必要重新发明轮子。

于 2012-11-06T15:54:39.763 回答