在多个qt线程中使用单个QSqlDatabase连接

时间:2016-07-28 13:13:54

标签: multithreading qt sqlite qtsql

我有一个多线程Qt应用程序,它有多个线程访问单个数据库。我是否需要创建单独的QSqlDatabase连接以在每个线程中执行SELECT / INSERT / UPDATE?

从Qt文档中,我无法理解以下指南是否阻碍了我建议的上述方法:

  

“只能在创建连接的线程中使用连接。   在线程之间移动连接或从中创建查询   不支持不同的线程。“

我几乎尝试在我的多个QThreads中使用相同的连接,并且所有工作都很好但是想要了解它是否正确。

  

仅供参考,我在Qt中使用sqlite3(使用Qtsql API)我理解支持序列化模式   默认值:https://www.sqlite.org/threadsafe.html

我想在多个线程中使用相同的连接名称的原因是因为当我尝试在多个线程上使用不同的连接到同一个数据库并执行SELECT / INSERT / UPDATE时,我经常遇到database locked问题。但是,在多个线程中使用相同的连接时,此问题已完全消除。

请指导。

此致

Saurabh Gandhi

1 个答案:

答案 0 :(得分:2)

文件不仅仅是令人沮丧,它断然说你不能这样做(强调我的):

  

连接只能在创建它的线程中使用

所以,不,您无法使用多个线程中的一个连接。它可能会起作用,但它不能保证工作,并且您正在调用相当于未定义行为的内容。但请注意,它也不能保证崩溃。

您需要:

  1. 序列化对您的数据库的访问,或

  2. 更改连接参数,以便锁定不会拒绝查询,但会阻止直到数据库可用。我不太确定database locked"问题"是:如果你实际使用多个连接,你永远不应该看到错误代码(我认为它是SQLITE_LOCKED)。 Sqlite 3可以很容易地从多个线程中使用,除了启用多线程和使用单独的连接之外,它不需要你的任何努力。