当前位置: 首页 > 科技观察

SQLite使用内存数据库

时间:2023-03-13 07:35:06 科技观察

SQLite数据库通常存储在单个普通磁盘文件中。但是,在某些情况下,数据库可能存储在内存中。强制SQLite数据库完全存在于内存中的一种常见方法是使用特殊文件名“:memory:”打开数据库。换句话说,不是将真实磁盘文件的名称传递给sqlite3_open()、sqlite3_open16()或sqlite3_open_v2()函数之一,而是传递字符串“:memory:”。例如:rc=sqlite3_open(":memory:",&db);调用该接口后,不会打开任何磁盘文件。而是在内存中创建一个新数据库。一旦数据库连接关闭,数据库就不再存在。每个内存数据库彼此不同。因此,打开两个数据库连接,每个连接的文件名为“:memory:”,将创建两个独立的内存数据库。特殊文件名“:memory:”可以在任何允许使用数据库文件名的地方使用。例如,它可以用作文件名中的ATTACH命令:ATTACHDATABASE':memory:'ASaux1;请注意,为了应用特殊的“:memory:”名称并创建纯内存数据库,文件名中不能有其他文本。因此,可以通过添加路径名在文件中创建基于磁盘的数据库,例如:“./:memory:”。使用URI文件名时,特殊的“:memory:”文件名也有效。例如:rc=sqlite3_open("文件::内存:",&db);或者,ATTACHDATABASE'file::memory:'ASaux1;内存数据库和共享缓存如果使用URI文件名打开内存数据库,则允许它们使用共享缓存。如果使用朴素的“:memory:”名称来指定一个内存数据库,那么该数据库总是有一个私有缓存,并且只对最初打开它的数据库连接可见。但是,同一个内存数据库可以由两个或多个数据库连接打开,如下所示:rc=sqlite3_open("file::memory:?cache=shared",&db);或者,ATTACHDATABASE'file::memory:?缓存=共享'ASaux1;这允许单独的数据库连接共享同一个内存数据库。当然,到共享内存数据库的所有数据库连接都需要在同一个进程中。当与数据库的最后一个连接关闭时,数据库将自动删除并回收内存。如果在单个进程中需要两个或多个不同的可同时共享的内存数据库,可以使用mode=memory查询参数和URI文件名来创建命名的内存数据库:rc=sqlite3_open("file:memdb1?mode=内存&缓存=共享",&db);或者,ATTACHDATABASE'file:memdb1?mode=memory&cache=shared'ASaux1;当内存数据库以这种方式命名时,它只会与使用完全相同名称的另一个连接共享其缓存。临时数据库当传递给sqlite3_open()或ATTACH的数据库文件的名称为空字符串时,将创建一个新的临时文件来保存数据库。rc=sqlite3_open("",&db);ATTACHDATABASE''ASaux2;每次创建一个不同的临时文件,就像使用特殊的“:内存:”字符串一样,到临时数据库的两个数据库连接都有自己的私有数据库。当创建它们的连接关闭时,临时数据库会自动删除。尽管为每个临时数据库分配了一个磁盘文件,但实际上临时数据库通常驻留在内存分页缓存中,因此“:memory:”创建的纯内存数据库与临时数据库之间的区别很小。从空文件名创建。唯一的区别是“:memory:”数据库必须始终保留在内存中,而如果数据库变大或SQLite处于内存压力下,临时数据库的部分内容可能会刷新到磁盘。前面的段落描述了默认SQLite配置下临时数据库的行为。如果需要,应用程序可以使用temp_storepragma和SQLITE_TEMP_STORE编译时参数来强制临时数据库表现为纯内存数据库。