2013-03-15 75 views
1

我有一个包含表A和含A的另一份我的每一个应用程序启动它时检查在主数据库中的表A的所有行和更新行的辅助数据库的主数据库A在辅助数据库中。随身携带的时间戳/ rowversion同步两个数据库

是否需要这种丑恶行为是旧的数据库但每个启动该操作已经开始非常昂贵的CPU支持。 我已经发现一个时间戳(也称为Microsoft版本的行版本)可以在行更新时存储。

我的应用将因此需要存储的上次修改/插入行的和在连续重新启动的最后的时间戳将只查询主数据库,用于从数据库中修改的行(或插入新的行)。

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

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

有什么方法,我可以很快地看到在主数据库中,而无需修改它有什么改变?

+0

您使用的是什么数据库引擎? SQL Server,Oracle,DB2,MySQL? – 2013-03-15 14:27:46

+0

H2数据库引擎,但是任何标准SQL都会很好,因为我只使用标准SQL主要是 – 2013-03-15 14:50:22

回答

0

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

然后你的应用程序启动时,它会读取deleted_rows表按你的触发器填充和适用这些变化给从分贝。完成后务必清除deleted_rows,以免稍后尝试重新处理这些记录。

+0

我编辑了我的问题,我无法编辑原始数据库并插入TRIGGER。 :( – 2013-03-15 13:49:04

+0

可以肯定的是,尽管已删除的行已经运行良好,至少在完成调整整个表之后,就像您已经在做的那样。 – 2013-03-15 13:56:04

+0

好的,所以只关注更新的行:如何获取最新更新行的时间戳X遍历数据库的所有原始行并在程序的下一次启动后,如何获得在该时间戳X之后修改或添加的行?这里没有太多例子。 – 2013-03-15 14:13:02

0

(1)假设表A上有一个主键,则有一个表只记录表B中的主键。当应用程序启动时,检查B中不再位于A中的行以获取删除的行。 (反之亦然将让你新的/插入的行。)

(2)行版本(与上面的合并)的确是非常适合你想要什么。否则,可能会使用一些校验和。 MS SQL Server作为CHECKSUM()函数,该函数可用于根据整行数据的内容生成散列值。 (尽管散列值不能保证是唯一的,但它们应该足够了,特别是在这里,因为您将检查散列值和主键值,其中主键将用于散列计算。)在应用程序启动,计算哈希值在表A中的所有现有行,并检查他们对上面创建的跟踪表:

  • 如果一套新的主键B中没有发现,这是一个新行,插入主键和散列值
  • 如果B中的主键未在新集中找到,则它是删除的行,删除
  • 如果在B中找到的主键和新集中的哈希值不同,则行已更新,相应地进行处理
  • 如果在B中找到主键并且在新集和哈希值匹配中,行尚未更新

不幸的是,我怀疑实现上述可能不会节省你很多时间,因为表A仍然需要全表扫描。

+0

点1对我来说似乎很好,但对于点2我不使用Microsoft产品,因为我更喜欢通用SQL数据库,在H2数据库或MySQL中是否有类似的功能?校验和似乎只是一个特定的列值而不是整行... – 2013-03-15 14:17:20

+0

在SQL中,您可以使用'CHECKSUM(*)'来计算整行的值。 Checksum是一个哈希函数,哈希函数是有用的和相对常见的 - 可能有第三方工具可以做到这一点?快速Google扫描会显示H2“password_hash”函数,如果您将多列数据输入到函数中,该函数可能会有所斩获,但这可能过于复杂。 – 2013-03-15 18:05:00

1

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

对于H2,它不是一个开箱即用的功能 - 但有一个开源工具,它似乎将此功能称为SymetricDS;根据FAQ,它适用于H2。

我会考虑使用它,而不是您自己的复制方案 - 除非您投入了大量时间,否则它可能会比您自己写的任何内容更快,更健壮。