【发布时间】:2010-10-20 06:37:26
【问题描述】:
我想在SQLite 数据库中实现缓存。我的主要目标是将数据写入 RAM,当缓存被填满时,我想将所有数据刷新到磁盘数据库。我想知道这是否可能?如果可能的话,我可以提供一些示例代码吗?
谢谢
【问题讨论】:
我想在SQLite 数据库中实现缓存。我的主要目标是将数据写入 RAM,当缓存被填满时,我想将所有数据刷新到磁盘数据库。我想知道这是否可能?如果可能的话,我可以提供一些示例代码吗?
谢谢
【问题讨论】:
【讨论】:
由于 sqlite 是事务性的,它依赖 fsync 来确保在提交事务时完成一组特定的语句。 fsync 的速度和实现因平台而异。
因此,通过在一个事务中批处理多个语句,可以显着提高速度,因为在调用 fsync 之前会写入多个数据块。
一篇较早的 sqlite 文章 here 说明了在事务内部和外部执行多个 INSERT 之间的区别。
但是,如果您正在编写需要并发访问数据的应用程序,请注意当 sqlite 启动写入事务时,所有读取(选择语句)都将被阻止。您可能想探索在写入事务发生时使用内存中的缓存来检索数据。
话虽如此,sqlite 的缓存方案也有可能为您处理。
【讨论】:
为什么要这样做?您是否遇到性能问题?或者您是否希望在您将数据提交到磁盘之前阻止其他连接看到数据?
关于同步到磁盘,需要在数据库完整性和速度之间进行权衡。您想要哪种取决于您的情况。
使用事务。优点:可靠性高,操作简单。缺点:一旦你开始一个事务,在你COMMIT 或ROLLBACK 之前,没有其他人可以写入数据库。这通常是最好的解决方案。如果你有很多工作要做,开始一个事务,写下你需要的一切,然后COMMIT。您的所有更改都将缓存在 RAM 中,直到您 COMMIT,此时数据库将显式同步到磁盘。
使用PRAGMA journal_mode=MEMORY 和/或PRAGMA synchronous=OFF。优点:速度快,操作简单。缺点:数据库不再对断电和程序崩溃安全。 使用这些选项可能会丢失整个数据库。但是,它们避免经常显式同步到磁盘。
将您的更改写入in-memory database 并在需要时手动同步。优点:速度快,可靠。缺点:复杂,另一个程序可以在你不知道的情况下写入数据库。通过写入内存数据库,您无需同步到磁盘,除非您愿意。其他程序可以写入数据库文件,如果您不小心,您可能会覆盖这些更改。这个选项可能太复杂了,不值得。
【讨论】: