1

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

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

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

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

编辑:我刚刚注意到我只以只读模式访问主数据库。因此,我不能在原始数据库中放置时间戳,也不能以任何方式插入排序触发器。

有没有什么方法我可以在不修改主数据库的情况下快速查看主数据库中的变化?

4

3 回答 3

1

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

对于 H2,它不是一个开箱即用的功能 - 但有一个开源工具似乎将其作为一个名为 SymetricDS 的功能提供;根据常见问题解答,它适用于 H2。

我会考虑使用这个,而不是你自己的复制方案——它可能比你自己写的任何东西都更快、更健壮,除非你花很多时间在它上面。

于 2013-03-15T16:11:28.390 回答
0

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

然后,当您的应用程序启动时,它会读取deleted_rows由您的触发器填充的表并将这些更改应用于从数据库。完成后一定要清除,deleted_rows这样您以后就不必费心尝试重新处理这些记录。

于 2013-03-15T13:30:49.480 回答
0

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

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

  • 如果B中没有找到新集合中的主键,则为新行,插入主键和哈希值
  • 如果在新集合中没有找到B中的主键,它是一个已删除的行,删除
  • 如果在 B 和新集合中找到的主键和哈希值不同,则行已更新,相应处理
  • 如果在 B 和新集合中找到主键和哈希值匹配,则行尚未更新

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

于 2013-03-15T13:59:52.033 回答