使用SQL数据库的同步框架:入门指南

17
我有一个应用程序,使用SQL Enterprise将所有数据存储在4个不同的数据库中。我需要为我的用户构建“离线”工作的能力。我通过将Merge Replication复制到每个人的本地SQL Express安装中来实现这一目标。这样做“有效”,但感觉有点粗暴。
例如,我将所有的14,000个人复制到每个数据库中,而任何个体用户可能只与100个左右的人进行交互。这还不包括他们在连接到中央数据库之间永远不会与超过5个人进行交互的事实。
我正在寻找关于Sync Framework 2(带有数据库)的技巧、指导和可能的详细教程。关于您的亲身经历以及为什么有效的第一手资料也将非常受欢迎。我还没有找到一个明确、简明(更不用说时效性)的与Sync Framework一起工作的教程。
我的具体要求是 MS SQL Server 2005 或 2008 的任何版本。任何 .Net 版本(3.5 或 4)。当前的数据层全部使用 LinqToSQL。目前没有使用任何 Sprocs
到目前为止,我的想法是只同步每个工作人员分配的工作负载和相关数据。理想情况下,我们将直接采用“签到/签出”格式,工作人员选择他们计划拜访的成员,然后同步所需的数据。
另外,有人能告诉我这被称为什么吗?我经常遇到“偶尔连接”这个词,但这似乎不准确。更准确的说法应该是“偶尔断开连接”,你有什么想法?

请告诉我是否需要更多细节、重新措辞或更好的焦点。这对我非常重要。 - Refracted Paladin
我非常感激所有抽出时间回答的人。但我对自己没有更好地表达问题感到失望,因为迄今为止的答案并没有真正解决我的问题。我将再编辑一次以尝试更好地说明问题。 - Refracted Paladin
我想你可能已经解决了这个问题,但如果没有的话,我可以建议几种使用同步框架2.0或2.1与SQL 2005或更高版本一起解决此问题的方法。我为一个有时连接的.NET 4应用程序实现了类似的功能,服务于400个用户。 - stombeur
9个回答

3

我们在几个项目中使用了Sync框架(一个是与sql server一起使用,另一个是与PGsql一起使用),所以我可以说它的工作相当不错。

查看这个演示应用程序,以了解您可以做什么。

http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=4835

这将向您显示如何在多个sql server数据库之间同步数据。您还可以自定义“增量”存储过程以获取自定义参数并基于这些参数筛选数据(例如客户端用户计划访问的人员)。

我还建议您使用反编译器来反编译Sync框架代码,以防出现奇怪的错误-有时候在看到异常被捕获在框架代码中之前,很难确定错误发生在哪里。Redgate对我来说完美无缺!

如果您需要更多帮助,请告诉我!


顺便提一下,所给的示例相当详细,展示了在三个不同的数据库中仅使用两个表进行同步的工作原理(一个服务器和两个客户端)。您将需要处理客户端插入操作在主键上创建冲突的情况 - 我们通过在每个客户端上具有广泛不同的序列来解决这个问题。 - Roopesh Shenoy
注意:您可能无法直接向人们提供,但您可以在增量SP中提及过滤条件(位置?帐户?)。 - Roopesh Shenoy

1

我有一些建议和提示,可能会或可能不会明显/有用。

对我来说,这听起来像是一个可以分为三个独立方面的问题:

同步过程

  • 您应该确保所有行都有某种“last_update”列,以便您的同步过程可以高效、可靠地确定哪些数据已经是最新的——这样,您就可以更加积极地同步大量记录。
  • 我会避免使用复杂的同步过程,尽可能使用蛮力方法。对我来说,14000条记录并不算太多——通过优化,您可能会发现在连接之间同步所有更改是可能的,并且时间合理。如果不行,我仍然可能会相当慷慨地同步您要同步的内容,以避免用户意识不到正在使用过时的数据。

推送离线模式下的更改

如果可能的话,我可能会简单地禁止离线模式下的更改——如果不可能,那么您应该考虑将更改推送为一个单独(而且可能相当复杂)的过程。

不了解应用程序的更多信息很难提出好的建议,因为同步过程非常依赖于业务。然而,有一些需要考虑的事情:

  • 用户能否锁定(或签出)一个项目,以防止其他人在离线工作时更改它?
  • 锁是否可被覆盖?
  • 如果锁被覆盖,当有人尝试保存更改时应该发生什么(合并过程似乎是个明智的选择)?
  • 某人能否编辑未签出的项目?

如果您决定实现一个复杂的离线更改流程,那么您可能想参考常见分布式版本控制系统中使用的工作流程。

更改离线数据存储

您可能会发现使用SQL CompactSQLite作为本地数据存储更加优雅的解决方案(这肯定会使安装过程变得更容易)。如果您正在使用LINQ,那么我可能更倾向于选择SQL Compact,因为它确实支持LINQ to SQL。

我会首先专注于上述的两个事项,因为这个改变在用户体验方面没有太多的改进,并且可能是最需要工作的部分-而上述的两个事项完全可以在使用SQL Server Express作为本地数据存储时实现。


1

0

这基本上被称为分布式计算

在我所工作的任何这样的系统中,我通常使用N-Tier架构来允许客户端程序偶尔连接到后端的数据库服务器进行CRUD操作。客户端执行的任何工作都被视为无连接,因为他们在保存更改之前不与服务器交互。

使用这种方法,您应该能够创建一个应用程序,使其能够连接一段时间以获取一些数据,在数据上执行一些操作,然后将任何更改(CRUD)传播到服务器(数据库)。

我必须说,对于本地Sql Express安装使用合并复制肯定是一种过度的方法。不要感到太难过,我们都会时不时地这样做:P。

编辑

我自己没有使用Sync Framework,但它看起来很不错。请查看Sync Framework Developer Center以获取有关它的更多信息。


0

听起来微软同步可能是您的一个不错选择。这里有一个关于数据库同步的概述http://msdn.microsoft.com/en-us/sync/bb887608.aspx。看一下它,看看它是否符合您的需求。它似乎是您问题的完美解决方案。


1
谢谢,我已经看过了。我只是希望能有更实践性的东西。感谢您的时间。 - Refracted Paladin

0
问题是,您的应用程序是否需要在设备上运行,并具有本地存储的断开连接数据,还是可以创建移动版本的Web前端,因为它们被认为始终需要与服务器连接才能处理数据?
我曾经参与的项目(很久以前)使用了紧凑框架和ActiveSync,其中包含Access或SQL Server后端,因为每个设备始终保持连接太昂贵了,就像手机一样。他们将设备带到现场,需要从断开连接的数据库访问数据,进行修改,并在回到办公室时同步。
如果这就是您要做的事情,您可以使用他们的设备ID来识别每个设备需要哪些案例/行,但如果您正在考虑开发自定义同步解决方案,我认为您正在打错战斗。已经完成了这项工作。使用经过验证的同步解决方案,限制所有内容,并专注于可以用来限制同步数据的标准。

1
感谢您的回复。我的用户大部分时间都会在办公室内联网,然后带着笔记本电脑出去工作。他们通常会提前知道需要哪些数据。这些数据需要是持久化的,因此需要使用本地数据库。他们在外出工作时将无法连接网络。 - Refracted Paladin
我很惊讶他们不想要平板电脑。大多数人在野外使用笔记本电脑觉得它们很笨重。再次强调,我会使用一些免费的同步解决方案,即使这可能意味着你在同步比实际需要更多的数据。大多数同步解决方案是表和字段级别的,而不是行级别的。 - Beth

0

看起来你需要更多地控制合并数据选项。根据这个要求,我可以看到有两种类型的数据; 属于成员的数据(Case属于成员),共享数据(参考,主数据)。

在这种情况下,我会将这些技术混合使用,以使事情变得半快速。

例如,主数据和参考数据的更改不是那么频繁。因此,我们不需要经常同步,但需要对更改进行控制,并且应该/必须在中央位置完成。在这种情况下,我会在我的中央DB上进行更改并使用Sledge Hammer方法。

对于交易数据,假设是单向的,在这种情况下,成员只能更改属于他/她的案例/行,可以使用许多方法实现。

如上所述,您可以使用Sync Framework开发人员中心或ActiveSync。

由于阈值不像PDA或掌上电脑那样严格,因此我们可以尝试手动方法,因为我们有笔记本电脑。使用BulkCopy操作实现连接和推送创建、更新和删除的数据的功能/过程例程(在这种情况下,我们必须在数据库级别维护一个标志),这是这种情况下最常见的方法(需要提供一个按钮供成员点击和调用,或者一个服务来轮询和检查连通性并自动启动同步例程)。

/KP


0

在与同步框架苦苦斗争了许多天后,我正在考虑放弃它,只是编写一些简单的WCF服务和代码。我的需求非常简单,从SQL2008到移动设备上的SQL CE进行单向同步。根据我的经验,定制化(仅同步某些字段等)非常困难,并且速度非常慢且效率低下。我认为微软需要做更多的工作,使其更容易使用。

谢谢

马克


0
你尝试过在行级别上过滤合并复制文章吗?这将把你的14k行大小减少到可管理的范围。

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