【问题标题】:Clojure: Java FileSystem Primitives for Implementing Database PersistenceClojure:用于实现数据库持久性的 Java 文件系统原语
【发布时间】:2012-06-28 09:04:20
【问题描述】:

上下文

这纯粹是为了教育目的。我想写一个原始数据库。重点不在于表现;但只是数据库背后的原则。我已经有关于锁定/互斥体/事务的材料。我一无所知的是写入磁盘/保证意外硬件(例如电源)故障的持久性。

为了有适当的恢复/持久性,我在将文件写入磁盘时需要一定的保证。

问题:

为了上述目的,我需要什么类型的文件原语(保证文件写入磁盘?保持文件打开并附加到日志?)? JVM 提供什么?

谢谢!

【问题讨论】:

  • 考虑一个类似于 SQLite 使用的模型(已经讨论过)。 “真正”所需的只是原子排他锁和同步。此外,还可以在 现有 Java 数据库(如 H2SQL 或 Derby)上取得成功。
  • 我的问题写得不好。我对 文件系统 原语感兴趣以确保持久性。我已经更新它以专注于文件系统原语。对此感到抱歉。
  • 原子排他 file 锁和 file 同步 ;-) “刷新”将确保 进程缓冲区酡。真正的fsync 将等待/阻塞,直到磁盘实际将数据保存到媒体。 (或者操作系统对此撒谎。)

标签: java clojure


【解决方案1】:

要在 write 调用返回之前强制将数据写入磁盘,您必须使用 FileChannel 并调用 force

【讨论】:

    【解决方案2】:

    这是一个很大的话题,因为现在磁盘周围有许多抽象层,尽管从 JVM 的角度来看,一旦调用,您就非常依赖 fsync 将您的位实际写入磁盘 fsync 你依赖于磁盘上的这些位。其余的都建立在此之上。

    【讨论】:

    • fsync 与 flush 有何不同?
    • 某些语言刷新会导致该程序中等待提供给操作系统的数据的缓冲区被刷新。刷新后它将被包含在下一个 fsync 中。
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2017-12-22
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多