2013-01-31 102 views
2

我有一個遠程Postgresql數據庫與一個表(我不能改變),包含信息(只有幾列不是整個表)我想同步到本地SQL Server 2008 Express數據庫與表(我可以改變)。使用C#同步兩個表在不同的數據庫

現在我正在尋找一種有效的方法來做到這一點。由於同步每運行約5分鐘,每次重新加載整個表都會產生很多不必要的流量,我試圖避免。

我想過保存最新的ID,只是抓住所有更新的東西,但是有可能(不太可能,但仍有可能)舊數據被改變。就這樣,我會錯過修改後的數據。

同步將由與本地SQL Server在同一臺機器上運行的C#程序完成。

+0

SQL 2008 Express是否帶有SQL Server代理?如果是這樣的話,你可以把它寫成一個預定的作業,這將消除對c#應用程序的需求。此外,表中有多少行,因爲它可能不是那麼多的流量。被更改的數據需要可見,並且沒有包含修改日期,哈希碼等的數據的某種標記,這將是困難的。不確定SQL複製是否適用於不同的數據庫提供者,但是如果它是另一種可以最小化流量的選項 – Charleh

+0

否Postgresql DB中的「LastModifiedTime」和「InsertTime」列? –

+0

不幸的是,Postgresql表沒有日期/修改列,我不能添加它們:(據我所知,SQL複製只適用於SQL Server之間。此時表約有100k行 –

回答

2

有兩個解決這個問題的方法。您可以嘗試變得聰明,只能傳輸更改 - 但是要求在源數據庫上進行一些整合;我確信你的數據庫管理員可以幫助你 - 可能觸發所有觸及的行(例如使用源表的主鍵)。這個解決方案可以很好地擴展,但它更復雜。我想你應該看看第二個選擇:簡單的蠻力。

通過它的聲音,你的整個桌子舒適地在100MB適合。這只是沒有太多數據。假設你可以獲得10MB/s的傳輸速率(這根本不是很古怪),你可以在10秒內傳輸所有內容。如果像你說的那樣,你只需要幾列,那麼總的數據傳輸可能會少得多。以每10分鐘10秒的數字來計算,這將會是3%負載的數量,以保持數據更新 - 這對於源數據庫來說是一個微不足道的查詢,可能不會導致太多負載,因爲數據集非常小,所以都會被緩存在內存中。

看看SqlBulkCopy。本文(Transderring data using SqlBulkCopy)是使用它將數據從一個數據庫複製到下一個數據庫的示例。源數據讀取器可以是任何東西;例如,我使用它從對象中插入計算的數據,但是一個特別簡單的情況是DbDataReader,您可以從Postgresql中爲select語句獲取該數據。

不幸的是,默認選項不太精彩,所以你可能想指定SqlBulkCopyOptions對你有用。 TableLock可能不是一個壞的。另外,如果你並行地執行這個操作(即將多個批量插入到一個表中),請注意索引(這可能導致死鎖)。如果使用批量複製批量大小,則可以優化吞吐量和內存使用量之間的權衡,儘管默認值可能正常工作。

概念,那麼我這樣做:

  • 打開你的源和目標數據庫的連接(使用using
  • 目標數據庫連接上啓動SqlTransaction
  • 刪除所有行目標表。
  • 從源到目標的批量複製(不要忘記通過交易)
  • 提交

這樣一來,你會原子更新目標表。

我不確定你要做什麼,但如果這是某種形式的緩存,請考慮徹底廢除目標SQL服務器,並將數據作爲對象數組存儲在內存中。內存中對只讀數據的訪問速度非常快,並且您的數據集很容易適應內存。