繁体   English   中英

具有内存和隔离功能的 SQLite

[英]SQLite with in-memory and isolation

我想创建一个内存中的 SQLite 数据库。 我想与这个内存数据库建立两个连接,一个用于修改,另一个用于读取数据库。 修改器连接将打开一个事务并继续对数据库进行修改,直到发生特定事件,此时它将提交该事务。 另一个连接将运行读取数据库的 SELECT 查询。 我不希望修改器连接所做的更改对读取器连接可见,直到修改器提交(发生了指定的事件)。 我想将读者的联系与作者的联系隔离开来。

我正在用 C++ 编写我的应用程序。 我尝试打开两个连接,如下所示:

int rc1 = sqlite3_open_v2("file:db1?mode=memory", pModifyDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_URI, NULL);
int rc2 = sqlite3_open_v2("file:db1?mode=memory", pReaderDb, SQLITE_OPEN_READONLY | SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_URI, NULL);

我创建了一个表,添加了一些行并使用'pModifyDb'将事务提交到数据库。 当我尝试通过调用 sqlite3_exec() 使用第二个连接“pReaderDb”检索值时,我收到返回代码 1 (SQLITE_ERROR)。

我尝试将 URI 指定为"file:db1?mode=memory&cache=shared" 我不确定'cache=shared'选项是否会继续保持隔离。 但是,当读取器连接尝试执行 SELECT 查询时,这也不起作用,返回码为 6 (SQLITE_LOCKED)。 也许是因为共享缓存选项统一了引擎盖下的两个连接?

如果我从 URI 中删除内存要求,而是使用"file:db1" ,一切正常。 我不想使用基于文件的数据库,因为我需要高吞吐量并且数据库的大小不会很大(~10MB)。

所以我想知道如何建立到单个 SQLite 内存数据库的两个独立连接?

提前致谢,克里斯

这对于内存数据库是不可能的。

您必须使用数据库文件。 要加快速度,请将其放在 RAM 磁盘上(如果可能),并在每个连接中禁用同步写入 ( PRAGMA synchronous=off )。

要同时允许读取器和写入器,您必须将 DB 文件置于WAL 模式

3.7.13 (2012-06-11) 版本开始,这似乎是可能的:

为内存数据库启用共享缓存允许同一进程中的两个或多个数据库连接访问同一个内存数据库。 共享缓存中的内存数据库会自动删除,并在与该数据库的最后一个连接关闭时回收内存。

文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM