我能否实现对内存中SQLite数据库的可伸缩多线程访问

u3r8eeie  于 2023-06-23  发布在  SQLite
关注(0)|答案(2)|浏览(154)

我有一个多线程Linux C应用程序,它需要一个高性能的参考数据查找工具。我一直在考虑使用内存中的SQLite数据库来实现这一点,但看不到在我的多线程环境中扩展的方法。
默认的线程模式(序列化)似乎受到单个粗粒度锁的影响,即使所有事务都是只读的。此外,我不相信我可以使用多线程模式,因为我不能创建到单个内存数据库的多个连接(因为每次调用sqlite3_open(“:memory:“,&db)都会创建一个单独的内存数据库)。
所以我想知道的是:我在文档中是否遗漏了一些东西,有可能让多个线程从我的C
应用程序共享访问同一个内存中的数据库。
或者,是否有一些替代SQLite,我可以考虑?

pu3pd22g

pu3pd22g1#

是的!请参阅从http://www.sqlite.org/inmemorydb.html处的文档中摘录的以下内容:

但它不是直接连接到DB内存,而是连接到共享缓存。请看图片。

内存数据库和共享缓存
如果使用URI文件名打开内存中数据库,则允许使用共享缓存。如果使用未修饰的“:memory:“名称指定内存中的数据库,则该数据库始终具有私有缓存,并且这仅对最初打开它的数据库连接可见。但是,同一个内存数据库可以通过两个或多个数据库连接打开,如下所示:

rc = sqlite3_open("file::memory:?cache=shared", &db);

或者

ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;

这允许不同的数据库连接共享同一个内存数据库。当然,共享内存中数据库的所有数据库连接需要在同一进程中。当与数据库的最后一个连接关闭时,数据库将自动删除并回收内存。
如果在一个进程中需要两个或多个不同但可共享的内存数据库,则mode=memory查询参数可以与URI文件名一起使用,以创建命名的内存数据库:

rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db);

或者

ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1;

当内存中数据库以这种方式命名时,它将只与使用完全相同名称的另一个连接共享其缓存。
引用官方文件。更多信息:https://www.sqlite.org/draft/inmemorydb.html

eaf3rand

eaf3rand2#

不可以,使用SQLite,您不能从不同的线程访问相同的内存数据库。这是设计好的更多信息请访问SQLite documentation

相关问题