【问题标题】:java - write two files atomicallyjava - 原子地写两个文件
【发布时间】:2012-03-21 22:07:51
【问题描述】:

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

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

非常感谢!

【问题讨论】:

    标签: java file transactions io atomic


    【解决方案1】:

    IMO 的安全方法是:

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

    这取决于它的重量和时间限制等。

    【讨论】:

      【解决方案2】:

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

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


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

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

      • 所有文件都在一个相当小的目录下
      • 您的应用程序拥有和
      • 存储在一个物理驱动器上:

      那么您可以执行以下操作:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            您不能锁定所有文件并仅在所有文件都被锁定后才写入它们吗?

            【讨论】:

            • 即使文件被锁定,仍然会出现IOException?
            猜你喜欢
            • 2012-04-05
            • 2012-08-14
            • 2019-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-11
            • 1970-01-01
            • 2019-06-20
            相关资源
            最近更新 更多