Small. Fast. Reliable.
Choose any three.

内存数据库

SQLite数据库通常存储在单个普通磁盘文件中。但是,在某些情况下,数据库可能存储在内存中。

强制SQLite数据库完全存在于内存中的最常见方法是使用特殊文件名“ :memory: ”打开数据库。换句话说,不是将真实磁盘文件的名称传递给sqlite3_open()sqlite3_open16()sqlite3_open_v2()函数之一,而是传递字符串“:memory:”。例如:

rc = sqlite3_open(“:memory:”,&db);

完成此操作后,将不会打开任何磁盘文件。而是纯粹在内存中创建一个新数据库。一旦数据库连接关闭,数据库就不存在了。每个:memory:数据库互不相同。因此,打开两个文件名分别为“:memory:”的数据库连接将创建两个独立的内存数据库。

特殊的文件名“:memory:”可以在允许数据库文件名的任何地方使用。例如,它可以被用作 文件名中的ATTACH命令:

ATTACH DATABASE':memory:'AS aux1;

请注意,为了应用特殊的“:memory:”名称并创建纯内存数据库,文件名中不得包含其他文本。因此,可以通过在文件名前添加路径名来创建基于磁盘的数据库,例如:“ ./:memory:”。

特殊的“:memory:”文件名在使用URI文件名时也可以使用。例如:

rc = sqlite3_open(“ file :: memory:”,&db);
或者,
ATTACH DATABASE'file :: memory:'AS aux1;

内存数据库和共享缓存

如果使用URI filename打开内存数据库,则可以使用共享缓存。如果使用未经修饰的“:memory:”名称来指定内存数据库,则该数据库始终具有专用缓存,并且仅对最初打开该数据库的数据库连接可见。但是,可以通过两个或多个数据库连接打开相同的内存数据库,如下所示:

rc = sqlite3_open(“文件::内存:?缓存=共享”,&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;

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

临时数据库

当传递给sqlite3_open()ATTACH的数据库文件的名称为空字符串时,则会创建一个新的临时文件来保存数据库。

rc = sqlite3_open(“”,&db);
ATTACH DATABASE''AS aux2;

每次都会创建一个不同的临时文件,因此,就像特殊的“:memory:”字符串一样,到临时数据库的两个数据库连接都有各自的专用数据库。创建临时数据库的连接关闭时,将自动删除这些临时数据库。

即使为每个临时数据库分配了一个磁盘文件,实际上,临时数据库通常也驻留在内存中的分页器缓存中,因此,“:memory:”创建的纯内存数据库与临时数据库之间的差异很小由空文件名创建。唯一的区别是,“:memory:”数据库必须始终保留在内存中,而如果数据库变大或SQLite受到内存压力,则可能会将一部分临时数据库刷新到磁盘。

前面的段落描述了默认SQLite配置下临时数据库的行为。如果需要,应用程序可以使用 temp_store pragmaSQLITE_TEMP_STORE编译时参数来强制临时数据库表现为纯内存数据库。