Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » MobiLink - 入门 » MobiLink 技术简介 » 了解 MobiLink 同步

 

设计 MobiLink 应用程序

数据库应用程序有两种基本体系结构:

  • 联机应用程序   用户通过直接连接中央数据库更新数据。连接中断时,用户无法工作。

  • 间歇性连接的智能客户端应用程序   每个用户都有一个本地数据库。无论连接与否,这些数据库应用程序都可供用户使用,并与系统中的其它数据库保持同步。

MobiLink 专用于创建间歇性连接的智能客户端应用程序。智能客户端应用程序可显著提高应用程序的可用性、效率和可伸缩性,但却给应用程序开发人员带来了新的问题。本节介绍智能客户端应用程序开发人员面临的一些主要问题,并介绍如何在 MobiLink 同步环境下实施解决方案。

只同步所需内容

在大部分应用程序中,如果每次要更新远程设备上的部分数据时都需要下载整个统一数据库,这简直就是一场灾难。时间和带宽都将成为制约因素,从而使整个系统难以运转。可采用许多技术来确保只上载和下载用户所需的数据。

首先,每个远程数据库只应包含统一数据库中表和列的一个子集。例如,区域 A 的某个销售人员可能需要区域 B 中某个销售人员或主管的不同表和列。

在放置在远程设备上的表和列中,您只希望将需要同步的内容进行同步。在 MobiLink 应用程序中,只要数据类型匹配,便可在表和列间建立映射,而不必考虑它们的名称。缺省情况下,数据既可以上载也可以下载,但是 MobiLink 还允许指定某些列只能上载或只能下载。

同步应只将与用户相关的行下载到远程数据库。您可能想按远程数据库、用户或其它条件将下载内容进行划分。例如,区域 A 的销售代表可能只需要区域 A 的数据更新内容。

您只想更新发生更改的数据。在 MobiLink 应用程序中,上载是基于事务日志的,因此缺省情况下,只有数据在远程数据库上发生了更改才会上载数据。要针对下载执行相同的操作,可以指定基于时间戳的同步,以便系统能够记录数据成功下载的时间,仅当从该时间开始数据发生了更改才会被下载。

您可能还想实现高优先级同步的系统:对时效性要求很高的数据安排频繁更新,但对时效性要求较低的数据安排在晚上或将设备放到底座中时更新。可以通过创建安排在不同时间运行的不同发布实现高优先级同步。

除此之外,用户还会从同步推送系统获益,在该系统中,将根据需要将数据有效地推送到远程设备。例如,如果货运公司的调度员获悉某处交通中断,他们可以下载一个更新给即将驶入该区域的卡车司机。在 MobiLink 中,这称为服务器启动的同步。

处理上载冲突

假设您有一个仓库。每个雇员有一台手持式设备,用来在加入或移走箱子时更新库存。每个班次以 100 箱开始,因此每个雇员的远程数据库将注册 100,统一数据库也如此。David 移走 20 个箱子。他更新其数据库并进行同步。目前,他的数据库和统一数据库都记录 80。与此同时,Susan 移走十个箱子。但是在 Susan 更新其数据库并进行同步时,她的应用程序认为统一数据库还有 100 个箱子而不是 80 个。这便产生了上载冲突。

在此仓库应用程序中,解决方法是创建冲突解决逻辑,该逻辑假定正确值为 David 更新后的值减去原始值与 Susan 的值的差:

80 - (100 - 90) = 70

虽然此冲突解决逻辑适用于基于库存的应用程序(如仓库),但并不适用于所有业务应用程序。通过 MobiLink,可以定义涵盖以下方面的冲突解决逻辑:

  • 库存模型   更新正确单元数的行。

  • 日期   最近更新的时间(基于数据库中值更改的时间,而不是值同步的时间)。

  • 人员   例如,经理或记录的拥有者始终优先。

  • 自定义   仅涉及您需要执行的任何其它业务逻辑。

某些情况下,可以自行设计系统以避免发生上载冲突。如果在远程对数据进行了分区因而没有重叠,可能会避免冲突。但是,如果冲突可能发生,则应创建一个编程式解决方案来检测和解决冲突。

唯一主键

要上载数据、检测上载冲突和同步统一数据库中删除的行,在数据库系统的每个同步表中都必须具有唯一主键。每个行具有的主键不仅在数据库内必须唯一,在整个数据库系统内也必须唯一。不得更新主键。

MobiLink 提供了多种方式来保证唯一主键。一种方式是将主键的数据类型设置为 GUID。GUID 即是全局唯一标识符,是 16 字节长的十六进制数。MobiLink 提供了 NEWID 功能,可以为每个新行自动创建 GUID。

另一种解决方案是组合键。在 MobiLink 中,每个远程数据库都有一个称为远程 ID 的唯一值。主键可由远程 ID 与常规主键(如序数值)构成。

SQL Anywhere 还提供了全局自动增量解决方案。可声明将一个列作为全局自动增量,这样,当添加一行后,可通过将最后一个值增加来自动创建主键。此解决方案最适合统一数据库为 SQL Anywhere 的情形。

最后,可以创建分发到远程数据库的主键值池。

与开发同步解决方案过程中的许多决定一样,在选择使用哪个主键系统时,必须结合您对统一数据库和远程数据具有的控制级别。通常,远程数据库必须能够在没有管理的情况下运行。您可能还会发现很难在统一数据库上更改模式。此外,选择 RDBMS 作为统一数据库可能会限制您的选择,因为并非所有 RDBMS 都支持全部功能。

处理删除

同步系统中的另一个问题是如何处理从统一数据库中删除的行。假设我从统一数据库中删除了一行。下次 David 同步其远程数据库时,会下载删除内容—从 David 的数据库中删除该行。但是我在统一数据库中该怎么处理这一行呢?我不能删除这一行,因为我还需要将它下载给 Susan。

可通过以下两种方法处理下载删除:首先,可以为每个表添加一个状态列,指示该行是否删除。这种情况下,行绝对不会被删除—只是标记为要删除。可以偶尔对标记为删除的行进行清理,只要您确信所有远程数据库都是最新的。或者,可以为每个表创建一个影子表。影子表用于存储已删除行的主键值。删除一行后,触发器就会填充影子表,影子表中的值决定在远程数据库中删除的内容。

事务

在同步的数据库系统中,只应同步已提交的数据库事务。此外,所有涉及将要同步的数据的已提交事务也要被同步,否则应生成错误。这是 MobiLink 中的缺省行为。

您还必须考虑与统一数据库的连接的隔离级别。在确保数据一致性的前提下,需使用能提供最佳性能的隔离级别。隔离级别 0 (READ UNCOMMITTED) 通常不适用于同步,因为它会导致数据不一致。

缺省情况下,MobiLink 上载时使用隔离级别 SQL_TXN_READ_COMMITTED,如果可能,将在下载时使用快照隔离(否则,使用 SQL_TXN_READ_COMMITTED)。快照隔离可消除事务在统一数据库上关闭前的下载阻塞问题,但并非所有 RDBMS 都支持这一特性。

夏令时

每年一次的夏令时使时间更改过程中的数据库同步产生了一个问题。在秋季,时间退回一个小时,即 2:00 AM 变为 1:00 AM。如果您试图在 1:00 AM 和 2:00 AM 之间进行同步,则同步时间戳就会不明确:同步时间是第一个 1:15 AM 还是第二个 1:15 AM?

要解决此问题,在秋季时间变更时您可以关闭一个小时,或者您可以将统一数据库服务器调整为协调通用时间 (UTC)。

进一步阅读