0

我正在使用 Delphi XE4 Architect(Delphi Xe3 也可以)我需要找到解决以下问题的智能解决方案,并且我想使用以下框架之一:kbmMW 或 RemOjects SDK / DataAbstract 或 RealThinClient

目前,我有一个应用程序在站点 A 上使用一个非常简单的 MSSQL 数据库,站点 B 的用户通过远程桌面使用该数据库。该应用程序有时需要显示一些图片并查看一些PDF,但它主要是文本数据输入。

我没有特别的理由使用 MSSQL,但我发现它是一个已经激活并填充的数据库,而且我还没有自己构建它。而现在,改变它会很复杂。(数据库不重要,不使用特定功能、存储过程和触发器)

站点 B 的用户通过非常慢的网络连接连接到 A 站点,并且偶尔连接不可用几个小时甚至一天(这是主要问题)。不幸的是,由于各种原因,连接的情况无法得到改善。

该数据库非常简单,有许多表几乎不会更改,大约有十个表每天都进行更新,并且可能会受到竞争性更改的影响。

主要是这些表的记录包含被锁定在更新中的数据,单个用户编辑某些字段,然后他保存释放锁。

我想得到一些非常不同的东西来优化性能。

A站点的用户优先级更高,他们更重要,因为A站点是总部。

我想将站点 A 的数据库复制到站点 B,以便站点 B 的用户可以在本地工作,速度更快,而无需使用连接到站点 A 的远程桌面。RDP 协议不是很优化并且在任何情况下,如果连接不存在,用户将无法工作。

在两个数据库之间同步和更新数据库锁记录可能不是什么大问题。

基本上,当站点 B 的用户在数据库 B 中获取编辑记录时,显然站点 A 的用户不应该能够修改站点 A 数据库上的相同记录。这也应该在相反的方向上起作用课程。

我的大问题是弄清楚如何最好地处理当 B 和 A 之间的连接在几个小时内不可用时发生的情况。(并且站点 B 上的事务/事件正在增加)。站点 A 上的事件通常优先于站点 B 上的事件(碰撞)。

站点 B 的用户必须能够继续工作。当连接变为活动状态时,应将更改发送到站点 A 的数据库。显然这会导致冲突,但可能由用户 B 对记录所做的更改可以被丢弃,或者可以在选择性的监督下完成由站点 B 的记录用户合并和批准记录。

好吧,我希望这个场景几乎解释清楚了。

附加信息:

  • DB schema 很简单,只有表,没有触发器,存储过程。所以我可以构建一个作为示例,但想象一下可以并发更新的 10 个表。

  • DB被销售部门的桌面应用程序使用,因此它包含大多数秘密数据。

  • 远程连接通常最大 512Kbit,但这里的主要问题是连接有时可能不活跃,远程站点上的用户无论如何都必须工作。这是主要的焦点。

  • 每日更新的总数据最大为 10 Mb,压缩后仅用于数据库连接。在同一连接上同步了一些其他数据,但它们不属于此作业。

  • 我不想使用特定的 MSSQL 工具或服务(复制等),因为 DB 将来可能会发生变化。

谢谢

4

1 回答 1

0

我们几乎完全使用 Delphi 客户端应用程序、基于 kbmMW 的 Delphi 服务器应用程序、MSSQL 数据库(尽管它过去在 DBISAM 数据库上也能很好地工作)来完成这项工作。

我们有一些表,只允许总部站点用户修改。每次“合并”时,较小的表都会全部传输。较大的表和事务类型表都具有添加日期和/或修改日期字段,并且仅传输在过去 3 周左右(可配置)内已更改或添加的记录。这意味着即使站点已经断开了相当长的时间,站点仍然可以更新到最新数据 - 我们曾经在可疑的拨号线路上让客户端位​​于偏远地区!

我们每天只运行一次或两次合并例程,但它在每小时或其他时间安排上同样有效。

在一天中的给定时间,每个站点(包括总部)将其更改/新记录“导出”到文件(例如客户端数据集表或类似文件)。然后这些被应用程序压缩并放置在“传出”文件夹中。zip 文件根据位置 id、日期、时间等命名。文件通过某些外部方式传输,例如通过 FTP / 文件共享 / 电子邮件等。每个分支机构将其数据文件发送/传输到总部和总部将其数据传输到每个分支。这些文件通过任何方式传输到“传入”文件夹。

每个位置都会定期(例如每小时)对传入文件夹进行检查,以查看是否有任何新内容要导入。如果是这样,它会添加所有新记录,分支位置会用新的数据表覆盖总部数据表,并且编辑的记录会以“某种方式”合并。这是棘手的一点。最简单的策略是“总公司获胜”,因此所有编辑都被接受,除非存在冲突,在这种情况下总公司版本获胜。或者,您可以使用“最后编辑的胜利” - 但是您需要确保时钟跨位置同步。另一种选择是将冲突记录添加到某种形式的“悬念”状态中,并让最终用户在未来的某个时间点做出决定。我们在一个数据集上执行此操作。

当总部导入数据或在总部添加数据时,会设置一个字段以指示数据是主数据的一部分。当分支添加数据时,此字段为空,表示它尚未到达主集。这有助于分支机构导出其数据,因为它们可以包含所有未设置此字段的数据。

我们发现您无法以交互方式运行合并,因为您最终将永远无法完成任何工作,并且您将无法在晚上运行合并等。它需要完全自动化并具有管理员的能力用户在事后的某个时候进行调整。

我们已经在多站点操作上运行这种方法好几年了,一旦它稳定下来,它就几乎完美无缺地工作了。每天有 2 个出口/进口计划,我们发现分支机构运行得非常好,并且只丢失了不到一天的交易。在我们不经常发生冲突的场景中效果很好。导出的数据在 5-10MB 范围内,压缩起来足够小。

主键很重要!我们使用 GUID,它还没有让我们失望。

数据库服务器和 n 层框架的选择实际上是无关紧要的。重要的是这里的过程。

基本上,当站点 B 的用户在数据库 B 中获取编辑记录时,显然站点 A 的用户不应该能够修改站点 A 的数据库中的同一记录。这也应该在相反的方向上起作用课程。

如果两个站点都有自己的数据库副本并且您偶尔允许丢弃/不存在的站点间连接,我看不出您将如何使这一位可靠地工作。

于 2013-06-01T11:22:23.787 回答