2012-03-21 31 views
6

我遇到了一個問題,我沒有一個乾淨的解決方案。我正在編寫一個Java應用程序,應用程序將某些數據存儲在有限的一組文件中。我們沒有使用任何數據庫,只是純文件。由於某些用戶觸發的操作,某些文件需要更改。我需要這是一個全或無的操作。也就是說,或者所有的文件都被更新,或者沒有。例如,如果5個文件中的2個文件發生了更改,而其他3個文件不是由於某些IOException導致的,則這是災難性的。java - 自動寫入兩個文件

完成此操作的最佳策略是什麼? 嵌入內存數據庫,如hsqldb,是獲得這種原子性/事務行爲的一個很好的理由嗎?

非常感謝!

回答

5

一種安全的方法是IMO:

  1. 備份
  2. 維護處理的文件
  3. 在例外列表,恢復已處理與備份一個的人。

這取決於它將會有多沉重,以及時間的限制等等。

2

完成此操作的最佳策略是什麼?嵌入內存數據庫(如hsqldb)是獲得這種原子性/事務性行爲的一個很好的理由嗎?

是的。如果您想要交易行爲,請使用經過充分測試的系統,這是考慮到這一點而設計的,而不是試圖在不可靠的基板之上推出自己的產品。


文件系統通常不支持涉及多個文件的事務。

非Windows文件系統和NTFS往往有,你可以做原子替換文件的屬性,因此,如果您不能使用一個數據庫和

  • 所有文件都是一個相當小的下目錄
  • 您的應用程序擁有它並存儲一個物理驅動器上

,那麼你可以做到以下幾點:

  1. 根據需要使用硬鏈接複製目錄內容。
  2. 修改5個文件。
  3. 以原子交換目錄的修改後的副本與原始
1

伊夫用於與成功的原子文件操作apache的公共事務庫。這允許您以事務方式修改文件,並可能在故障時回滾。

這裏有一個鏈接:http://commons.apache.org/transaction/

0

你能不能鎖定所有文件,並只給他們寫信,一旦所有的文件已被鎖定?

+0

即使文件被鎖定,IOException仍然會發生? – user1284566 2012-03-21 22:25:18

+0

哦,是的,你是對的。 – Jonatan 2012-03-21 22:27:37

1

我的方法是在你的java代碼中使用鎖。因此每次只有一個進程可以寫入一些文件。我假設你的應用程序是唯一寫入文件的。 如果即使如此,一些寫入問題發生「回滾」您的文件,您需要保存一個像上面建議的文件的副本。