SQLite:跨线程共享连接以进行读写

omg*_*ggs 12 sqlite multithreading c-api

我有一个使用SQLite(版本3.7.2)来存储数据的应用程序.我在多个线程之间共享一个SQLite连接,它从同一个SQLite数据库中写入和读取.SQLite使用DSQLITE_THREADSAFE = 1编译,这意味着SQLite处于序列化模式.

引用SQLite文档

序列化:在序列化模式下,SQLite可以被多个线程安全地使用而没有任何限制.

相反,SQLite Wiki条目说

不要在多个线程中同时使用相同的数据库连接

我尝试了一个示例应用程序,它生成了数百个线程,并共享一个SQLite句柄来读写,哪个工作正常.

那么SQLite wiki条目是否过时,或者SQLite可能无法使用相同的连接同时处理来自不同线程的读写操作?

Mar*_*Zen 8

编辑

DSQLITE_THREADSAFE = 2:多线程模式术语"多线程"在SQLite中有点混淆.似乎在多线程模式下,您无法与其他线程共享连接,因为连接本身不会使用互斥锁来阻止一个线程在另一个线程正在使用它时修改连接.

DSQLITE_THREADSAFE = 1:序列化模式但是,在序列化模式下,它将锁定数据文件并使用互斥锁来控制共享连接的访问​​.

从docs:...当使用SQLITE_THREADSAFE = 1编译SQLite时,SQLite库本身将序列化对数据库连接和预处理语句的访问,以便应用程序可以在不同的线程中使用相同的数据库连接或相同的预准备语句.同时.

因此,在处理连接时,序列化模式线程安全的,多线程模式不是,尽管您仍然可以与同一个数据库建立多个连接.

来源:http://www.sqlite.org/c3ref/c_config_getmalloc.html#sqliteconfigmultithread

问候!

  • 我读过这个,但我想知道wiki是否已经过时或者SQLite连接现在是否支持来自多个线程的同一连接的`read`和`writes`? (2认同)