2012-03-21 41 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代码中使用锁。因此每次只有一个进程可以写入一些文件。我假设你的应用程序是唯一写入文件的。 如果即使如此,一些写入问题发生“回滚”您的文件,您需要保存一个像上面建议的文件的副本。