主页 > php易尔灵网络科技

sqlite3缓存,参数?

214 2024-01-11 10:44

Sqlite 缓存参数在下文中查询:数据库一般运行在嵌入式环境中,需要兼顾性能和硬件资源。

SQLite 使用 PRAGMA 命令在 SQLite 环境内控制各种环境变量和状态标志。一个 PRAGMA 值可以被读取,也可以根据需求进行设置。主要介绍几个在嵌入式开发中经常使用的关键参数。

synchronous

synchronous Pragma 获取或设置当前磁盘的同步模式,该模式控制积极的 SQLite 如何将数据写入物理存储。也就是说该参数控制何时执行sync指令。

Pragma 值描述0 或 OFF不进行同步。1 或 NORMAL在关键的磁盘操作的每个序列后同步。2 或 FULL在每个关键的磁盘操作后同步。

当synchronous设置为FULL (2), SQLite数据库引擎在紧急时刻会暂停以确定数据已经写入磁盘。这使系统崩溃或电源出问题时能确保数据库在重起后不会损坏。为了保证数据的安全性,该项建议设置为FULL。

journal_mode

journal_mode Pragma 获取或设置控制日志文件如何存储和处理的日志模式。

Pragma 值描述DELETE默认模式。在该模式下,在事务结束时,日志文件将被删除。TRUNCATE日志文件被阶段为零字节长度。PERSIST日志文件被留在原地,但头部被重写,表明日志不再有效。MEMORY日志记录保留在内存中,而不是磁盘上。OFF不保留任何日志记录。

首先补充一个知识点,SQLite中日志模式主要有DELETE和WAL两种,其中WAL(Write ahead logging)是一种日志模式,它是一种思想,普遍应用于关系型数据库。每个事务执行变更时,修改数据页,同时会产生日志,这样在事务提交后,不需要将修改的脏页刷盘,只需要将事务产生的日志落盘即可返回。WAL保证日志一定先于对应的脏页落盘,就是所谓的WAL。

DELETE模式采用影子分页技术(Shadow paging),DELETE模式下,日志中记录的变更前数据页内容;WAL模式下,日志中记录的是变更后的数据页内容。事务提交时,DELETE模式将日志刷盘,将DB文件刷盘,成功后,再将日志文件清理;WAL模式则是将日志文件刷盘,即可完成提交过程。

建议将journal_mode 设置为delete,当数据写入数据库有失败动作时,透过journal档案予以复原到未更动前(原始)数据,来确保数据完整与一致性。如果在每次写入的时间很长或频繁的进行数据库写入情况下,因系统(主机)电力不稳或突然断电时,那么下次重新启动,而journal档案若存在,则在开启SQLite数据库时,若发现有journal档案的存在,便会对数据库做Rollback 动作(还原)。

journal_size_limit

默认值为-1,表示没有限制,单位是字节。

DELETE模式下,当日志增长超过阀值时,则进行截断。default_journal_size_limit,用于设置日志文件的默认大小。

cache_size

cache_size Pragma 可获取或暂时设置在内存中页面缓存的最大尺寸。

pages 值表示在缓存中的页面数。内置页面缓存的默认大小为 2,000 页,最小尺寸为 10 页。每页使用约1.5K内存,若需要使用改变大量多行的UPDATE或DELETE命令,并且不介意SQLite使用更多的内存的话,可以增大缓存以提高性能。建议设置为2000即可。

auto_vacuum

auto_vacuum Pragma 获取或设置 auto-vacuum 模式。

Pragma 值描述0 或 NONE禁用 Auto-vacuum。这是默认模式,意味着数据库文件尺寸大小不会缩小,除非手动使用 VACUUM 命令。1 或 FULL启用 Auto-vacuum,是全自动的。在该模式下,允许数据库文件随着数据从数据库移除而缩小。2 或 INCREMENTAL启用 Auto-vacuum,但是必须手动激活。在该模式下,引用数据被维持,自由页面只放在自由列表中。这些页面可在任何时候使用 incremental_vacuum pragma 进行覆盖。

正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加操作中再次使用。这种情况下使用VACUUM命令释放删除得到的空间。但是Vacuum的效率非常低!建议 设置成NONE(0),定时手动进行VACUUM操作。

void db_config(sqlite3 *db)

{

int ret;

char *errmsg=NULL;

system("sync");

ret = db_sql_exec(db,"pragma journal_mode=delete;",&errmsg);

if(ret !=SQLITE_OK)

{

fprintf(stderr, "config db wal error: %s\n", errmsg);

sqlite3_free(errmsg);

}

ret = db_sql_exec(db,"pragma synchronous=FULL;",&errmsg);

if(ret !=SQLITE_OK)

{

fprintf(stderr, "config db synchronous error: %s\n", errmsg);

sqlite3_free(errmsg);

}

ret = db_sql_exec(db,"pragma journal_size_limit=409600;",&errmsg);

if(ret !=SQLITE_OK)

{

fprintf(stderr, "config db journal_size_limit error: %s\n", errmsg);

sqlite3_free(errmsg);

}

ret = db_sql_exec(db,"PRAGMA cache_size =2000",&errmsg);

if(ret !=SQLITE_OK)

{

fprintf(stderr, "config db cache_size error: %s\n", errmsg);

sqlite3_free(errmsg);

}

ret = db_sql_exec(db,"PRAGMA auto_vacuum = NONE;",&errmsg);

if(ret !=SQLITE_OK)

{

fprintf(stderr, "config db auto_vacuum error: %s\n", errmsg);

sqlite3_free(errmsg);

}

}

参考:

https://blog.csdn.net/tietao/article/details/6890350

https://www.runoob.com/sqlite/sqlite-pragma.html

http://www.it165.net/database/html/201310/4691.html

https://blog.csdn.net/zhaofuguang/article/details/91882073

顶一下
(0)
0%
踩一下
(0)
0%
相关评论
我要评论
点击我更换图片

热点提要

网站地图 (共14个专题32719篇文章)

返回首页