加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

SQLite使用内存数据库

发布时间:2019-08-15 11:58:10 所属栏目:MySql教程 来源:底层软件架构
导读:SQLite数据库通常存储在单个普通磁盘文件中。但是,在某些情况下,数据库可能存储在内存中。 强制SQLite数据库单纯的存在于内存中的最常用方法是使用特殊文件名 :memory: 打开数据库。换句话说,不是将真实磁盘文件的名称传递给sqlite3_open(),sqlite3_

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

SQLite使用内存数据库

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

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

调用此接口完成后,不会打开任何磁盘文件。而是在内存中创建一个新的数据库。数据库连接关闭后,数据库就不再存在。每一个memory数据库彼此不同。因此,打开两个数据库连接,每个数据库连接的文件名为“:memory:”,将创建两个独立的内存数据库。

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

  1. ATTACH DATABASE ':memory:' AS aux1; 

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

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

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

要么,

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

内存数据库和共享缓存

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

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

要么,

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

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

如果在单个进程中需要两个或多个不同同时可共享的内存数据库,则mode = memory查询参数可与URI文件名一起使用以创建命名的内存数据库:

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

要么,

  1. ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1; 

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

SQLite使用内存数据库

临时数据库

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

  1. rc = sqlite3_open("", &db); 
  2. ATTACH DATABASE '' AS aux2; 

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

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

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

【编辑推荐】

  1. SQLite3的数据类型-动态数据类型
  2. 如何通过性能调优突破MySQL数据库性能瓶颈?
  3. 浅谈数据库同步和迁移
  4. SQLite,多个应用程序可以同时访问单个数据库文件吗?
  5. 四种分布式数据库场景选型、优缺点对比分析和未来展望
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读