首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

In-Memory Databases

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

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

rc = sqlite3_open(":memory:", &db);

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

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

ATTACH DATABASE ':memory:' AS aux1;

请注意,为了应用特殊的“:memory:”名称并创建纯内存数据库,文件名中不得包含其他文本。因此,可以通过预先设置一个路径名在文件中创建一个基于磁盘的数据库,如下所示:“./:memory:”。

当使用URI文件名时,特殊的“:memory:”文件名也适用。例如:

rc = sqlite3_open("file::memory:", &db);

或,

ATTACH DATABASE 'file::memory:' AS aux1;

内存数据库和共享缓存

如果使用URI文件名打开它们,则允许内存数据库使用共享缓存。如果使用未经修改的“:memory:”名称来指定内存数据库,那么该数据库始终有一个私有缓存,并且仅对原来打开它的数据库连接才可见。但是,相同的内存数据库可以通过两个或多个数据库连接打开,如下所示:

rc = sqlite3_open("file::memory:?cache=shared", &db);

或,

ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;

这允许单独的数据库连接共享相同的内存数据库。当然,共享内存数据库的所有数据库连接都需要处于相同的过程中。当数据库的最后一次连接关闭时,数据库会自动删除并回收内存。

如果在单个进程中需要两个或多个不同但可共享的内存数据库,则可以使用mode = memory query参数与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编译指示和SQLITE_TEMP_STORE编译时参数强制临时数据库的行为与纯内存数据库相同。

 SQLite在公共领域。

扫码关注腾讯云开发者

领取腾讯云代金券