一个data.json由多个源访问和更改

时间:2016-04-05 16:30:45

标签: javascript java json node.js filewriter

我的目标是在我的Java应用程序和node.js应用程序中使用JSON文件中的数据(" data.json")。

Java应用程序读取JSON文件并重写该文件,仅使用其他或已编辑的JSON对象。

我还希望node.js应用程序读取JSON文件并使用其他或编辑的JSON对象重写该文件。

最好的方法是什么?我可以选择从每个来源进行协作,同步和排队更改吗?

由于

1 个答案:

答案 0 :(得分:0)

显然,为了防止文件在并发写入和读取时损坏,您需要实现一些锁定系统。在单个进程中的线程之间,这是一项微不足道的任务,但是在进程之间并不容易。

有一个技巧可以在UNIX系统上运行,它基于以下事实:文件重命名过程在unix中是原子的。基于文件重命名,您可以实现简单的互斥锁,甚至更复杂的读写锁语义。对于简单的互斥锁,请使用以下策略:

  1. 当应用想要使用该文件时,请检查data*文件名。如果是data_locked_<some_pid>,请等待(或订阅FS通知,这样您就不需要轮询FS并花费CPU时间)并重复步骤1.
  2. 如果文件名为data,则尝试将文件重命名为data_locked_<pid>。如果尝试成功 - 使用该文件。
  3. 使用完文件后,将其重命名为data
  4. 这个简单的互斥语义将保持文件锁定以供单个进程使用,但是,读取操作可以安全地同时执行,因此您可以通过创建ReadWriteLock来进一步优化解决方案:

    读取:

    1. 当应用要阅读文件时,请检查文件名是data还是data_readlocked_<some_pid_list>。尝试将文件重命名为data_readlocked_<original_pid_list + pid>。如果尝试失败,请重复步骤1.
    2. 阅读文件。
    3. 重命名该文件,使其名称不再包含此进程pid。如果此进程pid是列表中唯一的 - 重命名为data。如果重命名尝试失败,请重复步骤3,直到尝试成功。
    4. 写作:

      1. 检查文件名是否为data。如果是,则重命名为data_writelocked_<pid>,如果失败则重复步骤1.如果文件名是其他任何内容,则data - 等待并重复步骤1.
      2. 写入文件。
      3. 将其重命名为data