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。

我會考慮使用它,而不是您自己的複製方案 - 除非您投入了大量時間,否則它可能會比您自己寫的任何內容更快,更健壯。