2011-05-05 88 views
0

我目前正面臨一個問題,試圖設計一個使用投箱式集成模式的可靠解決方案。文件到達文件系統中的文件夾,我必須將內容放入Oracle數據庫。問題是事務完成,然後文件被移動到另一個文件夾以指示處理已完成。假設進程在提交和文件移動之間被殺害。當進程重新啓動時,文件內容將再次插入到數據庫中,導致重複的數據。我覺得有兩種方法可以制定強健的解決方案,但我不確定應該選擇哪一種。我讀了帕特赫蘭的論文 Life beyond Distributed Transactions: an Apostate's Opinion,但現在我面臨着實際的實施問題。與投箱式集成模式交易

  1. 我可以使插入過程idempotent莫名其妙。換句話說,第二次插入嘗試會失敗,因爲數據已經存在於數據庫中。不幸的是,這些數據沒有唯一的標識符,除非我給它,所以我將不得不開始插入過程,將標識符作爲文件名的一部分並在文件到達系統後立即重命名。插入過程然後將使用該密鑰作爲主鍵的一部分,當嘗試插入時。

  2. 我可以做一些使用文件系統和數據庫的分佈式事務。我可以將文件移動到與數據庫提交相同的事務。我使用Java,我知道分佈式事務(XAResource),但我從來沒有使用它們。這個解決方案可能包括使用JBoss Transactional File I/O,雖然有很少的選擇。 XADisk是另一種可能類似的現成庫。

  3. 我可以使用一些其他的選擇,我沒有想到。

有什麼建議嗎?

回答

1

如果你想用XA去,你可以試試XADisk。我一直是XADisk項目的積極組成部分,並且有一些真正的生活項目已經使用XADisk解決了文件< - >數據庫一致性問題,類似於您所寫的內容。

我相信您會發現XA很簡單,至少從應用程序開發人員的角度來看,他們不必爲XA編寫事務管理器。

希望有所幫助。

Nitin(@XADisk)