在多线程应用程序中使用 SQLite

、概述

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()接口 的返回值是在编译时设置的 SQLITE_THREADSAFE 的值。它不反映在运行时通过sqlite3_config()接口或作为sqlite3_open_v2() 的第三个参数给出的标志对线程模式所做的更改

如果在编译时选择单线程模式,那么关键的互斥逻辑将从构建中省略,并且不可能在启动时或运行时启用多线程或序列化模式。

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(),则使用由编译时和启动时设置确定的默认模式。