保持两个数据库与timestamp / rowversion同步

时间:2013-03-15 13:24:44

标签: sql timestamp h2 data-synchronization

我有一个包含表A的主数据库和一个包含另一个A副本的辅助数据库。每次我的应用程序启动时,它都会检查主数据库中表A的所有行,并更新辅助数据库中的A行。

对这种丑陋行为的需求是对遗留数据库的支持,但是每次启动时的这种操作开始变得非常昂贵。 我发现时间戳(也称微软的行版本)可以在更新行时存储。

因此,我的应用程序需要存储上次修改/插入的行的最后一个时间戳,并且在连续重新启动时只会向主数据库查询数据库中已修改的行(或插入的新行)。

这会大大加快速度,但是我如何处理已删除的行? 谢谢

编辑:我刚注意到我只以只读模式访问主数据库。 因此,我无法在原始数据库中加入时间戳,也无法以任何方式插入排序的TRIGGERS。

有没有我可以快速查看主数据库中的更改而不修改它?

3 个答案:

答案 0 :(得分:1)

您正在构建的功能受到许多数据库引擎“开箱即用”的支持 - 它称为复制。

对于H2,它不是一个开箱即用的功能 - 但是有一个开源工具似乎提供了一个名为SymetricDS的功能;根据{{​​3}},它适用于H2。

我考虑使用它,而不是你自己的复制方案 - 它可能比你自己写的任何东西更快,更强大,除非你花了很多时间。

答案 1 :(得分:0)

您需要某种方法来标记已删除的行以便在从属端进行处理。这可能是一个使用触发器的好例子,当删除一行时,你将整行或者只是(table,id)元组存储在另一个表中 - 调用你的新deleted_rows表。

然后,当您的应用启动时,它会读取您的触发器填充的deleted_rows表,并将这些更改应用于从属数据库。完成后请务必清除deleted_rows,以免日后再尝试重新处理这些记录。

答案 2 :(得分:0)

(1)假设表A上有一个主键,有一个表只记录表B中的那些主键。当应用程序启动时,检查B中不再存在于A中的行以获取已删除的行。 (反之亦然会为您提供新的/插入的行。)

(2)行版(与上述相结合)确实是您想要的理想选择。如果做不到这一点,可能会使用一些校验和。 MS SQL Server作为CHECKSUM()函数,可用于根据整行数据的内容生成散列值。 (虽然哈希值不能保证是唯一的,但它们应该足够了,特别是在这里,因为您将检查哈希值和主键值,其中主键将用于哈希计算。)应用程序启动时,计算表A中所有现有行的哈希值,并根据上面创建的跟踪表检查它们:

  • 如果在B中找不到新集中的主键,则为新行,插入主键和哈希值
  • 如果在新集中找不到B中的主键,则删除行,删除
  • 如果在B中找到的主键以及新的集合和散列值不同,则行已更新,相应地处理
  • 如果在B中找到主键并且新设置和哈希值匹配,则行尚未更新

可悲的是,我怀疑实施上述内容可能无法为您节省那么多时间,因为表A仍然需要全表扫描。