gpt4 book ai didi

sqlite - 我能否实现对内存中 SQLite 数据库的可扩展多线程访问

转载 作者:IT王子 更新时间:2023-10-29 06:21:53 34 4
gpt4 key购买 nike

我有一个需要高性能引用数据查找工具的多线程 Linux C++ 应用程序。我一直在考虑为此使用内存中的 SQLite 数据库,但找不到在我的多线程环境中扩展它的方法。

即使所有事务都是只读的,默认线程模式(序列化)似乎也会受到单个粗粒度锁的影响。此外,我不相信我可以使用多线程模式,因为我无法创建到单个内存数据库的多个连接(因为每次调用 sqlite3_open(":memory:", &db) 都会创建一个单独的内存数据库数据库)。

所以我想知道的是:文档中是否遗漏了某些内容,并且可以让多个线程从我的 C++ 应用程序共享对同一内存数据库的访问。

或者,是否有一些我可以考虑的 SQLite 替代品?

最佳答案

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

但它不是直接连接到数据库内存,而是连接到共享缓存。这是一种解决方法。看图片。

Multiple connections to SQLite in-memory DB by shared cache

内存数据库和共享缓存

如果使用 URI 文件名打开内存数据库,则允许它们使用共享缓存。如果使用朴素的“:memory:”名称来指定内存数据库,那么该数据库总是有一个私有(private)缓存,并且只对最初打开它的数据库连接可见。但是,同一个内存数据库可以由两个或多个数据库连接打开,如下所示:

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;

当内存数据库以这种方式命名时,它只会与使用完全相同名称的另一个连接共享其缓存。

关于sqlite - 我能否实现对内存中 SQLite 数据库的可扩展多线程访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3267077/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com