在线文档教程
Sqlite
其他 | Miscellaneous

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.