【问题标题】:how we can ensure caching to reduce file-system write cycle for SQLite databases我们如何确保缓存以减少 SQLite 数据库的文件系统写入周期
【发布时间】:2010-10-20 06:37:26
【问题描述】:

我想在SQLite 数据库中实现缓存。我的主要目标是将数据写入 RAM,当缓存被填满时,我想将所有数据刷新到磁盘数据库。我想知道这是否可能?如果可能的话,我可以提供一些示例代码吗?

谢谢

【问题讨论】:

    标签: c++ c linux sqlite


    【解决方案1】:

    SQLite 已经进行了自己的缓存,这可能比您可以实现的任何东西都更有效 - 您可以阅读有关它的接口here。您可能对其他优化感兴趣 - 有一个常见问题解答here

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        由于 sqlite 是事务性的,它依赖 fsync 来确保在提交事务时完成一组特定的语句。 fsync 的速度和实现因平台而异。

        因此,通过在一个事务中批处理多个语句,可以显着提高速度,因为在调用 fsync 之前会写入多个数据块。

        一篇较早的 sqlite 文章 here 说明了在事务内部和外部执行多个 INSERT 之间的区别。

        但是,如果您正在编写需要并发访问数据的应用程序,请注意当 sqlite 启动写入事务时,所有读取(选择语句)都将被阻止。您可能想探索在写入事务发生时使用内存中的缓存来检索数据。

        话虽如此,sqlite 的缓存方案也有可能为您处理。

        【讨论】:

          【解决方案4】:

          为什么要这样做?您是否遇到性能问题?或者您是否希望在您将数据提交到磁盘之前阻止其他连接看到数据?

          关于同步到磁盘,需要在数据库完整性和速度之间进行权衡。您想要哪种取决于您的情况。

          1. 使用事务。优点:可靠性高,操作简单。缺点:一旦你开始一个事务,在你COMMITROLLBACK 之前,没有其他人可以写入数据库。这通常是最好的解决方案。如果你有很多工作要做,开始一个事务,写下你需要的一切,然后COMMIT。您的所有更改都将缓存在 RAM 中,直到您 COMMIT,此时数据库将显式同步到磁盘。

          2. 使用PRAGMA journal_mode=MEMORY 和/或PRAGMA synchronous=OFF。优点:速度快,操作简单。缺点:数据库不再对断电和程序崩溃安全。 使用这些选项可能会丢失整个数据库。但是,它们避免经常显式同步到磁盘。

          3. 将您的更改写入in-memory database 并在需要时手动同步。优点:速度快,可靠。缺点:复杂,另一个程序可以在你不知道的情况下写入数据库。通过写入内存数据库,您无需同步到磁盘,除非您愿意。其他程序可以写入数据库文件,如果您不小心,您可能会覆盖这些更改。这个选项可能太复杂了,不值得。

          【讨论】:

          • 您好,我想在我的 arm9 嵌入式 linux 平台上使用这个数据库。这里我使用闪存进行数据存储。闪存存在写入周期问题。所以我想写RAM 和填充 ram 后我想将它刷新到磁盘数据库。我该如何实现这个?任何示例代码或任何文档我可以得到?
          猜你喜欢
          • 2019-06-15
          • 1970-01-01
          • 2017-09-29
          • 2021-09-15
          • 2019-09-25
          • 2019-04-02
          • 2019-09-27
          • 1970-01-01
          • 2011-11-14
          相关资源
          最近更新 更多