我有一个包含表A的主数据库和一个包含另一个A副本的辅助数据库。每次我的应用程序启动时,它都会检查主数据库中表A的所有行,并更新辅助数据库中的A行。
对这种丑陋行为的需求是对遗留数据库的支持,但是每次启动时的这种操作开始变得非常昂贵。 我发现时间戳(也称微软的行版本)可以在更新行时存储。
因此,我的应用程序需要存储上次修改/插入的行的最后一个时间戳,并且在连续重新启动时只会向主数据库查询数据库中已修改的行(或插入的新行)。
这会大大加快速度,但是我如何处理已删除的行? 谢谢
编辑:我刚注意到我只以只读模式访问主数据库。 因此,我无法在原始数据库中加入时间戳,也无法以任何方式插入排序的TRIGGERS。
有没有我可以快速查看主数据库中的更改而不修改它?
答案 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中所有现有行的哈希值,并根据上面创建的跟踪表检查它们:
可悲的是,我怀疑实施上述内容可能无法为您节省那么多时间,因为表A仍然需要全表扫描。