我有一个系统,其中多个进程成功共享一个基于SQLite磁盘的数据库。数据库的大小和性质使得总是需要更快的访问,数据库是临时的,因此将其完全保存在内存中听起来是个好主意。我知道SQLite支持in memory databases,但似乎没有办法与另一个进程共享内存数据库(或者至少这是我理解它的方式)。考虑到SQLite似乎使用file mappings我认为没有理由不存在进程共享的内存数据库(至少在理论上)。
我很想知道是否有人知道如何做到这一点或有其他建议。
答案 0 :(得分:2)
确实,SQlite不支持与其他进程共享内存数据库。没有理由实现这样的功能,因为用例大多是人为的。您将性能引用为用例,但如果您使用的是Linux,则可以在tmpfs上创建基于文件的数据库。否则,您仍然可以使用许多编译指示(例如PRAGMA synchronous=OFF;
)来放弃数据库,从而放弃持久性。更进一步,如果您根本不需要事务支持,可以使用PRAGMA journal_mode=MEMORY;
在内存中准备提交,甚至可以使用PRAGMA journal_mode=OFF;
。
缺乏支持的主要原因之一是需要锁定。 SQlite需要一些方法来锁定数据库,当前这些锁定操作与SQlite VFS实现中的文件操作相关联。您可能仍然可以实现在内存中工作的自己的VFS模块,但是您可能会冒险实现文件系统。