2014-03-04 59 views
0

我正在開發基於spring框架的java應用程序。由於內存處理導致數據污染的風險 - JAVA

  1. 連接到MySQL數據庫
  2. 從MySQLTable1的POJO中實現
  3. 操縱(更新,刪除)在內存
  4. 插入到Netezza的數據庫表
獲取數據

上述4個過程是每個客戶端(A,B,C)每小時完成的。

我使用的是春天JDBC模板,得到這樣的數據:

SELECT COL1,COL2,COL3 FROM MySQLTable1 WHERE CLIENTID='A' AND COL4='CONDITION' 

和讀取每個記錄到一個POJO之前,我把它寫入Netezza公司表。

這個應用程序將有多個實例通過調度器每小時運行一次。 所以客戶A和客戶B可同時運行,但選擇將是獨一無二的, 我的意思是數據:

SELECT COL1,COL2,COL3 FROM MySQLTable1 WHERE CLIENTID='A' AND COL4='CONDITION' 

將不同於

SELECT COL1,COL2,COL3 FROM MySQLTable1 WHERE CLIENTID='B' AND COL4='CONDITION' 

但要記住所有這些都存儲在記憶爲POJO。

我的問題是:

  1. 有數據污染的風險?
  2. 是否需要使用spring數據事務管理器來實現數據庫事務?
  3. 我的應用程序是否真的需要使用類似Spring Batch來處理這個問題?

我很感激您的想法和反饋。

我知道這是使用ETL工具的完美場景,但這超出了範圍。

+0

如果您擔心數據污染,則需要爲每個客戶端運行單獨的JVM。對於Java對象來說,「污染」彼此是沒有辦法的,因爲你自己的編碼缺陷。但是,您確實需要警惕數據庫,但我對Spring並不熟悉,但同時針對單個數據庫的多個線程會產生干擾的重大機會。 –

+0

順便說一句:要非常小心「單身」和靜態數據。 –

回答

1

是否有數據污染的風險?

這取決於您對數據所做的操作,但是如果每個實例都是獨立的,我不會看到數據如何被污染,您只需確保併發運行的每個實例都不在相同的數據(客戶端ID)。

是否需要使用spring數據事務管理器來實現數據庫事務?

您可能需要插入到Netezza表中的交易。您當然希望您的數據在結果表中具有一致的狀態。如果在進程中間發生錯誤,您可能需要回滾在失敗之前插入的所有內容。關於交易管理器,您並不需要Spring交易管理器,但由於您使用的是Spring,因此它可能是一個不錯的選擇。

我的應用程序真的需要使用像Spring Batch這樣的東西來處理這個嗎?

是否真的需要它,也許不是,但Spring Batch是爲那些類型的應用程序的製作,所以它可能會幫助你組織你的應用程序(Spring Batch的提供可重複使用的功能,在處理大量的記錄是必不可少的,其中包括記錄/跟蹤,事務管理,作業處理統計,作業重新啓動,跳過和資源管理)。一切都可以在沒有框架的情況下完成,如果你有一個非常小的應用程序,那麼使用它可能是矯枉過正的。但最終,如果你需要這些功能,你可能會想要使用它...

1

彈簧批 ETL,所以使用它將是一個很好的適合這種用例,也是一個很好的選擇到一個商業ETL工具。

是否有數據污染風險?客戶端A和B讀取單獨的數據,所以它們絕不會因意外讀取或寫入相同的數據而相互干擾。如果創建兩個具有相同ID的客戶端,風險將是這樣,但事實並非如此。

是否需要使用spring數據事務管理器來實現數據庫事務? 雖然程序化事務管理有許多缺陷,但最好避免,但並不強制需要這樣做。 Spring Batch將爲您管理事務,以及其他方面,如分頁。

我的應用程序真的需要使用像Spring Batch這樣的東西來處理這個嗎?沒有強制性的需要這樣做,但它會有很大幫助,特別是在尋呼方面。你將如何處理返回數千行的查詢?沒有框架,這需要手動處理。

相關問題