java - 原子地写两个文件

时间:2012-03-21 22:07:51

标签: java file transactions io atomic

我正面临一个问题,我没有一个干净的解决方案。我正在编写Java应用程序,应用程序将某些数据存储在一组有限的文件中。我们没有使用任何数据库,只是普通文件。由于某些用户触发的操作,需要更改某些文件。我需要这是一个全有或全无的操作。也就是说,要么更新所有文件,要么不更新任何文件。如果例如5个文件中的2个被更改,而其他3个不是由于某些IOException,则是灾难性的。

实现这一目标的最佳策略是什么? 是否嵌入内存数据库(例如hsqldb)是获得这种原子性/事务行为的一个很好的理由?

非常感谢!

5 个答案:

答案 0 :(得分:5)

安全的方法IMO是:

  1. 备份
  2. 维护已处理文件的列表
  3. 在例外情况下,恢复已使用备份处理过的那些。
  4. 这取决于它的重量和时间等限制。

答案 1 :(得分:2)

  

实现这一目标的最佳策略是什么?是否嵌入内存数据库(例如hsqldb)是获得这种原子性/事务行为的一个很好的理由?

是。如果您想要交易行为,请使用经过充分测试的系统,该系统的设计考虑到了这一点,而不是试图在不可靠的基板上滚动自己的系统。


通常,文件系统不支持涉及多个文件的事务。

非Windows文件系统和NTFS往往具有可以替换原子文件的属性,因此如果您不能使用数据库并且

  • 所有文件都在一个相当小的目录下
  • 您的申请所拥有的
  • 存储在一个物理驱动器上:

然后您可以执行以下操作:

  1. 根据需要使用硬链接复制目录内容。
  2. 修改5个文件。
  3. 以原始
  4. 原子交换目录的修改副本

答案 2 :(得分:1)

我已成功使用apache commons事务库进行原子文件操作。这允许您以事务方式修改文件,并可能在故障时回滚。

这是一个链接:http://commons.apache.org/transaction/

答案 3 :(得分:1)

我的方法是在你的java代码中使用一个锁。因此,每次只有一个进程可以写一些文件。我假设您的应用程序是唯一写入文件的应用程序。 如果即使如此,一些写入问题就会“回滚”你的文件,你需要保存一份文件副本,如上面的建议。

答案 4 :(得分:0)

您是否无法锁定所有文件,只有在锁定所有文件后才能写入文件?

相关问题