2010-01-18 177 views
2

我使用Spring批處理來執行大量批處理操作的系統。
我在內存DAO中使用SimpleJobRepository。
我想知道是否有辦法避免使用JobRepository?類似於無資源事務管理器的東西?
我問的原因是系統應該不斷運行而不必重新啓動,我對它將消耗的內存有一些擔憂。
我知道我可以使用基於數據庫的JobRepositry,但坦率地說,我真的不需要一個。Spring批處理資源JobRepository

如果沒有辦法做到這一點,我會感激,如果有人可以向我保證內存消耗問題。

謝謝。

回答

3

您必須使用作業存儲庫,因爲它包含有關作業上下文的信息。 您的案例的解決方案是 - 使您的作業存儲庫與範圍=「原型」 這將爲每個作業celate一個新的內存道(地圖實現),因此沒有內存問題。在批處理作業方面,每次創建新實例的開銷都是毫無意義的。

+0

+1謝謝 - 並接受答案。 – 2010-01-31 15:11:05

+0

我試過這種方法沒有用。它一直拋出IllegalStateExceptions,因爲工作執行不會被保存(因爲新的存儲庫是空的)。還嘗試使用原型JobLauncher和JobRepository獲得相同的結果。 – ElderMael 2013-10-15 17:05:46

1

內存中實現有一個主要缺點:在批處理中不能使用多線程。

因此您必須使用數據庫存儲庫。 我建議你使用H2 SQL:它是一個非常輕巧的嵌入式數據庫。 我們將它用於我們的單元測試。

它與Hibernate一起工作得很好。

這個方法優於Ben的方法是你可以連接到你的內存數據庫來檢查作業狀態(以及啓動日期等)。

+0

我真的不需要檢查作業狀態等。如果你可以詳細說明爲什麼多線程是使用內存作業存儲庫時的一個問題,它將會很棒。無論如何,我想減少內存使用量,所以在內存數據庫是不是一個很好的選擇對我來說。 – 2010-02-25 08:58:07

+0

內存中的實現不是線程安全的,這就是爲什麼你不能將它與多線程結合使用。 – 2010-03-03 10:27:21

+3

使用最新版本,內存中實現現在是線程安全的:) – 2011-04-29 14:19:56

1

我認爲只要我的批處理代碼是線程安全的,存儲庫是否在內存或數據庫中應該沒有關係。是的,如果你使用數據庫,你可能會失去一些集羣優勢,但如果我的服務器上只運行一個批處理作業,並且使用多線程來完成它的工作,那應該沒問題。