2015-09-11 100 views
1

我需要一個從一個數據庫實例(DB1)獲取整個表並在另一個數據庫實例(DB2)上創建相同的解決方案。早些時候我使用了Spring集成,但是我聽說Spring Batch可以更好地適用於這種情況,我想嘗試一下。從數據庫到數據庫的克隆表

因此,是否有可能/有SENCE使用下面的步驟Spring Batch的工作:

  1. 在具有相同的模式從DB1源表DB2創建一個空表。
  2. 從DB1表中選擇 - >更新DB2表。如果在步驟中出現錯誤 - 在DB2上回滾並刪除表。

使用彈簧集成我看到可能的解決方案JdbcInboundChannelAdapter -> QueueChannel -> OutboundGateway,但也許春季批可以是一個更好的選擇?任何建議非常感謝。

+2

爲什麼不簡單地使用數據庫呢?在DB1中導出並在DB2中導入?你爲什麼想用應用程序做到這一點? –

+0

因爲它必須是現有應用程序和服務的一部分,所以很明顯。 –

+1

緩慢且容易出錯。數據庫通常具有開箱即用的支持。我會首先嚐試獲得一個DBA,它可以告訴你如何用SQL輕鬆完成,然後圍繞這個寫一個服務。不要把整個數據庫拉到內存中,並且再次存儲它通常是一個壞主意,尤其是如果它是一個普通的副本...(恕我直言,是)。 –

回答

1

這取決於您的要求。

我們最初使用spring-batch加載DWH。但這不是一個簡單的副本。生產數據庫中的數據存儲在垂直表格設計(aka實體屬性值模型)中。此外,每個條目也是雙時代的歷史。總而言之,這些大約在5000'000'000行左右,必須按照正確的時間維度進行分組並轉換爲水平數據庫設計。當然,這是從DB2到Oracle。因此我們必須顯着地轉換結構,必要時我們必須轉換數據類型,並且要處理50億行。

如果您在同一個數據庫系統中只有簡單的1:1副本,那麼最簡單的方法就是使用數據庫工具。

如果您必須在不同的DB系統之間進行傳輸,則可以選擇spring批處理。

如果您必須轉換數據,無論是結構還是類型,spring批處理可能是一個選項。

如果你有很多行,你可以使用spring批處理的分區功能來並行或者簡單地用幾次不同的id範圍來啓動同一個作業。

如果您有多個要複製的表,您可以使用splitflow來並行加載來自各個表的數據。

在我目前正在使用的公司中,我們有完全通用的File/Db讀取器和寫入器,它們完全基於DB元模型。如果我想做一個簡單的複製工作,我只需要將源和目標數據源與所需的表一起定義,並適當地初始化讀者和作者。如果名稱匹配,我甚至不需要添加配置來映射表之間的數據。

這導致我們以下基本問題

  1. 需要什麼樣的轉換邏輯的,如果在所有?
  2. 需要什麼樣的表現?
  3. 需要複製多少個表格?
  4. 是源和目標在同一個系統上?
+0

謝謝你的回答,關於你的觀點:1.不需要轉換。 2.性能不是必需的 - 我們只是想成功克隆表。 3.每個工作會議一個。 4.源和目標可以像在不同的系統上一樣,通常它會是不同的數據庫實例。 –