使用SQLite作为文件缓存

5
我的C++应用需要支持对从网络下载的文件进行缓存。开始我正在编写本地LRU实现,但有人建议我考虑使用SQLite来存储每个条目的ID、文件二进制数据(通常是音频文件)和添加/修改日期时间。
在简单情况下,当只有一个客户端访问本地SQLite数据库文件时,我的概念验证运行良好。
然而,我还需要支持应用程序中不同进程的多个访问,以及支持应用程序的多个实例,它们都读取/写入同一数据库。
我已经找到了一些帖子来研究,但我也想在这里向专家们询问- SQLite是否适合此使用情况,如果是,我应该深入挖掘哪些特性/设置来支持我的多个访问情况。
谢谢。
M.

1
关系型数据库通常被设计用于多个进程使用。只需确保提交您的插入/更新/删除事务,并读取已提交的行。 - Gilbert Le Blanc
谢谢你,吉尔伯特 - 你是指在我将拼接的SQL语句发送到sqlite3_exec()执行之前,用BEGIN_TRANSACTIONCOMMIT来括起来吗? - Molly Birk
2个回答

4

大多数文件系统实际上也是数据库,并且大多数为每个文件存储两个或更多的时间戳,即与最后修改时间和最后访问时间相关的时间戳,从而可以实现LRU缓存的实现。直接使用文件系统将像任何DB一样有效地利用存储空间,而且可能更加高效。 假设您遵循文件系统中安全并发访问的规则和算法,文件系统已经针对多个进程的高效和相对安全的访问进行了优化。

SQLite的主要优点可能是对记录列表排序的支持稍微简单一些,但代价是需要使用单独的查询API。当然,DB还提供了存储其他描述性属性的未来能力,而无需将其编码在文件名或其他附加文件中。


感谢你的见解,Greg,并且同意第二段。我希望SQLite能够帮助我处理多个线程/进程同时尝试访问文件的问题 - 如果文件直接存储在文件系统中,我将不得不自己处理这个问题,但我希望SQLite可以为我完成大部分工作。 - Molly Birk
正如我所暗示的,有一些相当著名的算法可以安全地允许多个进程/线程同时创建和删除共享文件。SQLite可能会通过减少这里的复杂性来帮助,但可能会以一些性能为代价,因为在文件系统中,每个进行修改的进程都是完全独立的,并且没有被DB事务序列化。 - Greg A. Woods

1
然而,我也需要支持应用程序中不同进程的多重访问,同时支持应用程序的多个实例-全部读取/写入相同的数据库。SQLite肯定可以支持这种使用情况。关键在于您有多个读者和写入者。SQLite的WAL模式支持并发多个读取者和单个写入者。因此,在您的应用程序中,请确保有一个专用于写入的连接以及一个或多个连接(即连接池)专用于读取。这实际上是一种非常常见的模式,即便是用于可扩展的复制数据库服务器也是如此。唯一真正的争议点可能在于应用程序的多个运行实例都试图同时写入时。如果您可以指定单个实例为“写入器”,并将所有写请求路由到该实例,则它将处理该问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接