当前位置: 首页 > news >正文

【sqlite】WAL初探

打开数据库后可以PRAGMA journal_mode;查看
事实上journal_mode一共有6种:

DELETE/TRUNCATE/PERSIST:类似的,都是journal模式,把原始内容先备份出来,再往.db里面写
.
MEMORY:小事务频繁写入提交很快,断电就会出问题
.
WAL:大事务批量写入比MEMORY快,读取速度极快,综合能力最好,使用最广
.
OFF:写入极快,安全性等于无

以上6种,在设置PRAGMA journal_mode=xxx;时,只有设置WAL会持久化,其它的都会在下一次打开db时变回DELETE。

.db头中也可以看到端倪,其实也就是0x12开始,WAL模式是0x0202,其它模式都是0x0101:

offsetsizedescription
181File format write version. 1 for legacy; 2 for WAL.
191File format read version. 1 for legacy; 2 for WAL.

OK。我们来研究一下WAL
看看deepseek的总结:

WAL (Write-Ahead Logging) - 大多数现代应用的推荐选择
.
读取速度: ★★★★★ (极快)

读操作不会与写操作竞争数据库文件的锁。读操作直接读主数据库文件,而写操作在WAL文件上进行。

支持高并发读取,一个线程在写入时,其他线程可以无阻塞地读取(读取器看到的是写入开始前的快照)。
.
写入速度: ★★★★☆ (很快)

写入是“追加”到WAL文件末尾,这通常比随机写入主数据库文件更快,尤其是在HDD上。

缺点是提交事务时,需要调用fsync确保数据落盘,并且需要定期执行检查点 将WAL内容写回主数据库。
.
适用场景:

需要高并发读写的应用(如Web服务器、桌面应用)。

读远多于写的场景。

追求最佳综合性能的通用场景。

db-wal/db-shm与db-journal的生命周期对比

db-wal/db-shmdb-journal
open db 后不存在不存在
create table; 后存在不存在
insert; 后存在存在
commit; 后存在不存在
close db 后不存在不存在

可以看到db-wal/db-shm的生命周期比db-journal要长的。

代码如下:

#include <stdio.h>
#include "sqlite3.h"// 回调函数用于显示PRAGMA查询结果
static int callback(void* data, int argc, char** argv, char** azColName) {for (int i = 0; i < argc; i++) {printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}return 0;
}int main() {sqlite3* db;char* err_msg = NULL;int rc;// 删除之前的测试数据库(如果存在)remove("int.db");// 打开数据库连接rc = sqlite3_open("int.db", &db);if (rc != SQLITE_OK) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));return 1;}printf("1. 数据库连接已建立\n");// 先查询当前的日志模式printf("2. 当前日志模式: ");rc = sqlite3_exec(db, "PRAGMA journal_mode;", callback, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "查询日志模式失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}// 启用WAL模式printf("3. 设置WAL模式: ");rc = sqlite3_exec(db, "PRAGMA journal_mode=WAL;", callback, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "启用WAL模式失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}// 创建测试表const char* create_table_sql ="CREATE TABLE test_ints (""tiny INT,""small INT, ""medium INT,""large INT,""negative INT"")";rc = sqlite3_exec(db, create_table_sql, NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "创建表失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}printf("4. 测试表已创建\n");// 开始一个事务(显式开始)rc = sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "开始事务失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}printf("5. 事务已开始\n");// 插入数据但不提交const char* insert_sql ="INSERT INTO test_ints VALUES (1, 128, 32768, 2147483647, -1);""INSERT INTO test_ints VALUES (127, 255, 65535, 4294967295, -128);""INSERT INTO test_ints VALUES (0, 16384, 1000000, 1000000000, -32768);";rc = sqlite3_exec(db, insert_sql, NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "插入数据失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}printf("6. 数据已插入但未提交\n");// 提交事务rc = sqlite3_exec(db, "COMMIT;", NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "提交事务失败: %s\n", err_msg);sqlite3_free(err_msg);}else {printf("7. 事务已提交\n");}sqlite3_close(db);return 0;
}
http://www.dtcms.com/a/516636.html

相关文章:

  • 制作网站的顺序是海南网上报名系统
  • 做网站都需要哪些知识珠海市住房和城乡建设局网站
  • MySQL分组查询GROUP BY
  • 数组——双指针:75.颜色分类
  • LLD文档核心:从模块设计到落地开发
  • 雄安做网站深圳出台科技支持政策
  • 网站域名能更该吗怎样用模板建网站
  • proc文件系统入门到精通教程
  • 点积、内积与哈达玛积详解
  • 杭州模板建站2022注册公司取名
  • 政务网站建设论文西地那非片吃了多久会硬起来
  • 金融杠杆全解析:从铁矿期货保证金计算到期权盈亏分析
  • 【工具变量】绿色金融改革创新试验区DID数据集(2000-2024年)
  • Prometheus:从概述到部署
  • 32.768khz音叉式圆柱型贴片晶振CMR200T
  • ROS2创建Python与C++功能包指南以及什么是节点(ros2第一章)
  • wordpress可以建网站吗电子商务网站建设 教案
  • vr中xr射线长度调整
  • 怎样做微信挂机平台网站建设公司的网站首页
  • 【Go】P11 掌握 Go 语言函数(二):进阶玩转高阶函数、闭包与 Defer/Panic/Recover
  • 无奈!我用go写了个MySQL服务
  • 重庆网站建设业务招聘网站推广方式主要通过
  • GaussDB 数据集成方案:ETL 工具如何简化企业上云过程
  • 如何解决 pip install 安装报错 externally-managed-environment(PEP 668)问题
  • 相向双指针|两数之和II-输入有序数组|三数之和|统计和小于目标的下标对数目|最接近的三数之和|四数之和|有效三角形的个数
  • ffmpeg4.4.2 gcc 15.2.0 编译错误
  • 免费的大语言模型API接口
  • css3 学习笔记
  • 高水平的网站建设南昌做个网站多少钱
  • 宁夏建设工程质量安全监督总网站wordpress发送文章链接过期