网站首页 > 教程文章 正文
1.概述
SQLite支持三种不同的线程模式:
- 单线程。在此模式下,所有互斥锁都被禁用,并且SQLite一个链接不能在多个线程中使用。
- 多线程。在这种模式下,只要在两个或多个线程中不同时使用单个数据库连接,SQLite就可以被多个线程安全地使用。
- 串行模式。在串行模式下,SQLite可以被多个线程安全地使用而没有任何限制。
可以在编译时(从源代码编译SQLite库时)或在启动时(当使用SQLite的应用程序正在初始化时)或在运行时(当已经创建了SQLite数据库链接时)选择对应的线程模式来创建连接)。一般来说,运行时会覆盖启动时,启动时会覆盖编译时的配置。需要强调的是,一旦选了单线程模式就无法覆盖。
注意:默认的模式是串行模式。
2.编译时选择线程模式
编译时参数使用SQLITE_THREADSAFE表示线程模式。如果编译时参数不存在SQLITE_THREADSAFE,则使用串行模式。这可以通过-DSQLITE_THREADSAFE = 1显式化 。使用 -DSQLITE_THREADSAFE = 0时,线程模式是单线程。使用 -DSQLITE_THREADSAFE = 2时,线程模式是多线程的。
sqlite3_threadsafe()接口 的返回值由编译时线程模式选择决定。如果在编译时选择了单线程模式,则sqlite3_threadsafe()返回false。如果选择了多线程或串行模式,则 sqlite3_threadsafe()返回true。该sqlite3_threadsafe() 接口早在多线程模式和启动时间和运行时间模式选择,因此是无法多线程和串行模式,也没有区分是它能够报告开始时间或运行时模式的变化。
如果在编译时选择单线程模式,则从编译中忽视一些重要的逻辑,所以无法在启动时或运行时启用多线程或串行模式。
3.线程模式的开始时间选择
假设编译时线程模式不是单线程,则可以在初始化期间使用sqlite3_config()接口更改线程模式 。该
SQLITE_CONFIG_SINGLETHREAD动词设置SQLite为单线程模式,SQLITE_CONFIG_MULTITHREAD 动词设置SQLite为多线程模式,SQLITE_CONFIG_SERIALIZED动词设置SQLite为串行模式。
4.运行时选择串行模式
如果在编译时或启动时未选择单线程模式,则可以将单个数据库连接创建为多线程或串行化。无法将单个数据库连接降级为单线程模式。如果编译时或开始时模式是单线程,也不可能升级单个数据库连接。
单个数据库连接的线程模式由作为sqlite3_open_v2()的第三个参数给出的标志确定。所述 SQLITE_OPEN_NOMUTEX标志导致数据库连接是在多线程模式和SQLITE_OPEN_FULLMUTEX标志使是在串行化模式的连接。如果未指定任何标志或者使用 sqlite3_open()或sqlite3_open16()而不是sqlite3_open_v2(),则使用由编译时和开始时设置确定的默认模式。
猜你喜欢
- 2025-09-23 5分钟快速掌握在Python使用SQLite数据库,
- 2025-09-23 ExcelVBA 连接 MySQL 数据库_vba怎么连接数据库sql
- 2025-09-23 Python+SQLite 终极实战指南:零基础到高效开发
- 2025-09-23 搭建electron+vite框架的三种方法
- 2025-09-23 免装环境!SQLite 可视化神器,Java 开发者速通指南
- 2025-09-23 没想到一个Trae的提示词工具,居然会有这么多人喜欢?
- 2025-09-23 ExcelVBA:创建SQLite数据库,以及CRUD基本操作函数(1/2)
- 2025-09-23 Qt编程进阶(21):Qt操作SQLite数据库及实例
- 2025-09-23 Python (Sqlite)用事务写多表数据的简单例子
- 2025-09-23 SQLite被曝漏洞 90%以上设备可能受影响
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)
