Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SQLite具有内存和隔离功能_C++_Sqlite_In Memory_Isolation - Fatal编程技术网

C++ SQLite具有内存和隔离功能

C++ SQLite具有内存和隔离功能,c++,sqlite,in-memory,isolation,C++,Sqlite,In Memory,Isolation,我想创建一个内存中的SQLite数据库。我想对这个内存数据库建立两个连接,一个进行修改,另一个读取数据库。修饰符连接将打开一个事务并继续对DB进行修改,直到发生特定事件,此时它将提交该事务。另一个连接将运行SELECT查询来读取数据库。我不希望修改器连接所做的更改对读卡器连接可见,直到修改器已提交(指定的事件已发生)。我想把读者和作者的联系分开 我正在用C++编写我的应用程序。我已尝试打开两个连接,如下所示: int rc1 = sqlite3_open_v2("file:db1?mode=me

我想创建一个内存中的SQLite数据库。我想对这个内存数据库建立两个连接,一个进行修改,另一个读取数据库。修饰符连接将打开一个事务并继续对DB进行修改,直到发生特定事件,此时它将提交该事务。另一个连接将运行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);
我已经创建了一个表,添加了一些行,并使用
'pmodfydb'
将事务提交到数据库。当我试图通过调用sqlite3_exec()使用第二个连接“pReaderDb”检索值时,我收到一个返回代码1(SQLITE_ERROR)

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

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

所以我想知道如何在内存数据库中设置到单个SQLite的两个独立连接

提前感谢,,
kris

这在内存数据库中是不可能的

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


要同时允许读写器,您必须将DB文件放入。

同步不会有什么区别。如果OP希望在另一个连接写入数据库的同时从数据库中读取数据,它需要处于WAL日志模式(内存中的数据库不支持这种模式,因此,是的,需要是一个文件备份的数据库)。感谢您的回复!我不认为我可以创建一个RAM磁盘(我的代码是一个交付应用程序,必须在各种平台上运行,我不知道事情会如何发展)。目前,我已经缓存了所有修改SQL语句,并在所述事件发生时执行它们。