我有一个系统,其中多个进程成功共享一个基于 SQLite 磁盘的数据库。数据库的大小和性质决定了总是需要更快的访问速度,而数据库无论如何都是临时的,因此将其完全保存在内存中听起来是个好主意。我知道 SQLite 支持内存数据库,但似乎没有办法与另一个进程共享内存数据库(或者至少我是这样理解的)。考虑到 SQLite 似乎使用文件映射,我看不出为什么进程共享的内存数据库不存在(至少在理论上)。
我很想知道是否有人知道这样做的方法或有其他建议。
确实,SQlite 不支持与其他进程共享内存数据库。几乎没有理由实现这样的功能,因为用例大多是人为的。您将性能作为一个用例,但如果您在 Linux 上,则可以在 tmpfs 上创建一个基于文件的数据库。否则,您仍然可以使用许多 pragma,例如PRAGMA synchronous=OFF;
通过放弃持久性来加速数据库。更进一步,您可以使用PRAGMA journal_mode=MEMORY;
在内存中准备提交,甚至PRAGMA journal_mode=OFF;
在您根本不需要事务支持时使用。
缺乏支持的主要原因之一是需要锁定。SQlite 需要一些方法来锁定数据库,目前这些锁定操作与 SQlite VFS 实现中的文件操作相关联。您可能仍然能够实现自己的在内存中工作的 VFS 模块,但您可能会冒着实现文件系统的风险。