Java - 原子性地写入两个文件

7
我遇到了一个问题,但是我没有一个干净的解决方案。我正在编写一个Java应用程序,该应用程序将某些数据存储在一组有限的文件中。我们不使用任何数据库,只使用普通文件。由于某些用户触发的操作,需要更改某些文件。我需要这是一个全有或全无的操作。也就是说,要么全部文件都更新,要么一个都不更新。如果由于某些IOException造成5个文件中有2个文件被更改,而其他3个文件没有更改,那么会很灾难性。
什么是实现这一目标的最佳策略? 嵌入内存数据库(例如hsqldb),是否是实现原子性/事务行为的好方法?
非常感谢!
5个回答

5

我认为一个安全的方法是:

  1. 备份
  2. 维护已处理文件列表
  3. 在异常情况下,使用备份文件恢复已处理的文件。

这取决于处理的文件数量和时间限制等因素。


2
什么是实现这一目标的最佳策略?嵌入内存数据库(如hsqldb)是获得这种原子性/事务行为的好方法吗?
是的。如果您想要事务行为,请使用经过充分测试并专为此而设计的系统,而不是在不可靠的基础上尝试自己构建。
文件系统通常不支持涉及多个文件的事务。
非Windows文件系统和NTFS往往具有以下特性,即如果您无法使用数据库且
所有文件都位于一个相对较小的目录下, 该应用程序拥有该目录并 该目录存储在一个物理驱动器上:
那么您可以执行以下操作:
1. 使用适当的硬链接复制目录内容。 2. 修改5个文件。 3. 原子交换修改后的目录副本和原始目录。

1
我曾经成功地使用过Apache Commons Transactions库来进行原子文件操作。这使您能够以事务方式修改文件,并在失败时可能回滚。
这是一个链接:http://commons.apache.org/transaction/

1
我的做法是在你的 Java 代码中使用锁,这样每次只能有一个进程写入某个文件。我假设你的应用程序是唯一一个写入这些文件的程序。 即使如此,如果出现一些写入问题需要"回滚"你的文件,你需要像上面建议的那样保存文件的副本。

0

你不能锁定所有文件,只有在所有文件都被锁定后才能写入吗?


即使文件被锁定,IOException 仍然可能发生吗? - user1284566

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接