17

我有一个使用 SQL Enterprise 将所有数据存储在 4 个不同数据库中的应用程序。我需要为我的用户建立“离线”工作的能力。我通过为每个人Merge Replication进行本地SQL Express安装来实现这一点。这个“有效”,但感觉就像大锤的方法。

例如,当任何个人用户只能与 100 人左右交互时,我将所有 14000 人复制到每个数据库。这还不包括在与中央数据库的连接之间他们永远不会与超过 5 个 ish 交互的事实。

我正在寻找的是技巧、指针,也许还有一个关于 Sync Framework 2(带有数据库)的不错的教程。关于什么对您有用以及为什么对您有用的第一手资料也是最受欢迎的。我还没有遇到一个清晰简洁(更不用说当前)的教程来使用Sync Framework.

我的具体情况是MS SQL Server 20052008 年,任何版本。任何.Net版本(3.5 或 4)。当前的数据层是 all LinqToSQL。目前没有任何Sprocs正在使用的。

到目前为止,我的想法是只同步分配给每个工作人员的工作量和相关数据。理想情况下,我们会直接采用“签入/签出”格式,他们选择计划访问的成员,然后同步必要的数据。

作为奖励,有人可以告诉我这被称为什么吗?我一直遇到“偶尔连接”,但这似乎不准确。将它们称为“偶尔断开连接”会更准确,想法?

4

9 回答 9

3

我们一直在我们的几个项目中使用 Sync 框架(一个使用 sql server,一个使用 PGsql),所以我可以说它运行良好。

查看此演练应用程序以了解您可以做什么。

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

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

我还建议您使用反射器来反编译 Sync 框架代码,以防您看到奇怪的错误 - 有时在您看到框架代码中捕获的异常之前无法确定错误在哪里。Redgate 非常适合我!

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

于 2010-08-19T11:49:01.737 回答
1

http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=3422 This is a nice walk-through using SQL Server CE should work great for what you are trying to do and has a much smaller footprint. Seems to me that the functionality that you lose with not hamper what you are trying to do in the least.

于 2010-08-20T12:36:55.697 回答
1

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

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

同步过程

  • 您绝对应该确保所有行都有某种“last_update”列,以便您的同步过程可以有效且可靠地确定哪些数据已经是最新的 - 这样您就可以更加积极地处理记录的数量你正在同步。
  • 我会避免复杂的同步过程,并尽可能简单地使用蛮力方法。14,000 条记录对我来说听起来并不多——通过优化,您可能会发现它可以在合理的时间内同步连接之间所做的所有更改。如果不是,那么我可能仍然对您同步的内容非常自由,以避免用户在没有意识到的情况下使用过时的数据。

推送在离线模式下所做的更改

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

在不了解应用程序的情况下很难提出好的建议,因为同步过程非常依赖于业务,但是需要考虑的一些事项是:

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

如果您确实决定实施复杂的离线更改流程,那么您可能需要查看通用分布式 VCS 中使用的工作流程以获得灵感。

更改离线数据存储

您可能会发现使用SQL CompactSQLite作为本地数据存储是一种更优雅的解决方案(它肯定会使安装过程更容易),如果您使用的是 LINQ,那么我可能会支持 SQL Compact,因为它肯定有 LINQ SQL 支持。

我将首先关注以上两个,因为这种更改在最终用户改进方面提供的效果最少,并且可能是最多的工作 - 以上两个是完全可以实现的,同时仍然使用 SQL Server Express 作为本地数据存储。

于 2010-08-16T06:28:23.630 回答
0

您是否尝试过在行级别过滤合并复制文章?这会将您的 14k 行大小减少到可管理的范围内。

于 2010-08-19T14:54:42.343 回答
0

在我看来,Microsoft Sync 对您来说可能是一个不错的选择。这里有同步数据库的概述, http: //msdn.microsoft.com/en-us/sync/bb887608.aspx。看看它,看看它是否满足您的需求。这听起来像是您问题的完美解决方案。

于 2010-08-11T16:03:48.920 回答
0

在与同步框架苦苦挣扎了很多天之后,我正在考虑放弃它,只写一些简单的 WCF 服务和代码。我的要求是相当简单的,在移动设备上从 SQL2008 到 SQL CE 的单向同步。根据我的经验,自定义非常困难(仅同步某些字段等)并且非常缓慢且效率低下。我认为微软需要做更多的工作来让它更容易使用。

干杯

标记

于 2010-08-19T00:08:29.620 回答
0

问题是,您的应用程序是否需要在本地存储断开数据的设备上运行,或者您是否可以创建 Web 前端的移动版本,因为在处理数据时它们被假定始终需要连接到服务器?

我从事的项目(很久以前)使用紧凑型框架和带有 Access 或 SQL Server 后端的 activesync,因为让每个设备(如电话)始终连接起来太昂贵了。他们将设备带到现场,需要从断开连接的数据库中访问数据,做了他们的模组,并在他们回到办公室时同步。

如果这就是您正在做的事情,您可以使用他们的 deviceID 来确定每个设备需要哪些案例/行,但是如果您正在考虑开发自定义同步解决方案,我认为您打错了仗。这已经完成了。使用经过验证的同步解决方案、限制和所有内容,并专注于可用于限制同步数据的标准。

于 2010-08-12T17:38:56.963 回答
0

这本质上称为分布式计算

在我工作过的任何此类系统中,我通常使用N 层架构来允许偶尔将客户端程序连接到后端的数据库服务器以进行 CRUD 操作。客户端所做的任何工作都被认为是无连接的,因为它们在保存更改之前不会与服务器交互。

使用这种方法,您应该能够创建一个应用程序,允许他们暂时连接以获取一些数据,对数据执行一些工作,然后将任何更改(CRUD)传播到服务器(数据库)。

我不得不说,将合并复制与本地 Sql Express 安装一起使用肯定是一种大锤方法。不要为此感到难过,我们都会时不时地这样做:P。

编辑

我自己没有使用过 Sync Framework,但它看起来不错。查看Sync Framework 开发人员中心以获取更多信息。

于 2010-08-11T15:57:56.790 回答
0

您似乎需要对合并数据选项进行更多控制。有了这个要求,我可以看到有两种类型的数据;属于成员的数据(案例属于成员)和共享数据(参考、主数据)。

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

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

对于Transactional数据,假设一次定向,在这种情况下成员只能更改属于他/她的case/rows,可以通过多种方式实现。

如上所述,您可以使用 Sync Framework Developer Center 或 ActiveSync。

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

/KP

于 2010-08-15T16:00:38.873 回答