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
- 相关评论
- 我要评论
-