Using SQLite In Multi-Threaded Applications
在多线程应用程序中使用SQLite
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_CONFIG_SERIALIZED谓词设置序列化模式。
4. 线程模式下,运行时间的选择
如果在编译时或启动时未选择单线程模式,则可以创建单个数据库连接作为多线程或序列,但无法将单个数据库连接降级到单线程模式。如果编译时或启动时模式为单线程,也不可能升级单个数据库连接。
单个数据库连接的线程模式由作为sqlite3_open_v2()的第三个参数给出的标志确定。SQLITE_OPEN_NOMUTEX标志会导致数据库连接处于多线程模式,并且SQLITE_OPEN_FULLMUTEX标志会导致连接处于串行模式。如果既没有指定标志,也没有使用sqlite3_open()或sqlite3_open16()而不是sqlite3_open_v2(),则使用由编译时和开始时间设置确定的默认模式。
SQLite is in the Public Domain.