当前位置:  开发笔记 > 前端 > 正文

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

如何解决《我是否可以实现对内存中SQLite数据库的可扩展多线程访问》经验,为你挑选了1个好方法。

我有一个多线程Linux C++应用程序,需要一个高性能的参考数据查找工具.我一直在考虑使用内存中的SQLite数据库,但是在我的多线程环境中看不到这种方法可以扩展.

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

所以我想知道的是:在文档中是否有我遗漏的内容,并且可以让多个线程共享来自我的C++应用程序的相同内存数据库的访问权限.

或者,我可以考虑使用SQLite的替代方案吗?



1> Chand Priyan..:

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

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

通过共享缓存与SQLite内存数据库的多个连接

内存数据库和共享缓存

如果使用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;

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

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有