为了防止 SQLite 内存数据库被清理,必须使用相同的连接来访问数据库。但是,使用相同的连接会导致 SQLite 同步对数据库的访问。因此,如果我有许多线程对内存数据库执行读取操作,那么在多核机器上运行的速度比针对文件支持的数据库运行完全相同的代码要慢。
有什么办法可以两全其美?也就是说,允许对数据库进行多次并发调用的内存数据库?
为了防止 SQLite 内存数据库被清理,必须使用相同的连接来访问数据库。但是,使用相同的连接会导致 SQLite 同步对数据库的访问。因此,如果我有许多线程对内存数据库执行读取操作,那么在多核机器上运行的速度比针对文件支持的数据库运行完全相同的代码要慢。
有什么办法可以两全其美?也就是说,允许对数据库进行多次并发调用的内存数据库?
答案是不。我询问了 SQLite 用户组,得到了 Pavel Ivanov 的以下回复:
不,SQLite 不支持对任何数据库的完全并发访问。您可以获得的唯一并发性是拥有没有共享缓存的磁盘数据库(因此实际上在内存中有多个数据库副本)。当然,我不考虑来自不同进程的并发选项。
如果您将页面大小和缓存大小设置为足够大以包含整个数据库,则将从缓存中完成读取操作,并且性能将几乎等于内存数据库。
从这里我明白答案是肯定的http://www.sqlite.org/faq.html#q6