Small. Fast. Reliable.
Choose any three.
在多线程应用程序中使用SQLite

1.概述

SQLite支持三种不同的线程模式:

  1. 单线程。在这种模式下,所有互斥锁均被禁用,SQLite不安全,无法一次在多个线程中使用。

  2. 多线程。在这种模式下,如果两个或多个线程中没有同时使用单个数据库连接,则可以安全地由多个线程使用SQLite。

  3. 序列化。在序列化模式下,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_CONFIG_MULTITHREAD 动词集多线程模式,SQLITE_CONFIG_SERIALIZED动词序列模式集。

4.线程模式的运行时选择

如果在编译时或启动时未选择单线程模式,则可以将单个数据库连接创建为多线程或序列化。无法将单个数据库连接降级为单线程模式。如果编译时或启动时模式是单线程,则无法升级单个数据库连接。

单个数据库连接的线程模式由作为sqlite3_open_v2()的第三个参数给出的标志确定。所述 SQLITE_OPEN_NOMUTEX标志导致数据库连接是在多线程模式和SQLITE_OPEN_FULLMUTEX标志使是在串行化模式的连接。如果未指定任何标志,或者使用 sqlite3_open()sqlite3_open16()代替 sqlite3_open_v2(),则使用由编译时和启动时设置确定的默认模式。