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

Using a single QSqlDatabase connection in multiple qt threads

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

根据 Qt 文档,我无法理解以下准则是否阻碍了我建议的上述方法:

"A connection can only be used from within the thread that created it. Moving connections between threads or creating queries from a different thread is not supported."

我实际上已经尝试在我的多个 QThread 中使用相同的连接并且实际上一切正常但想了解它是否正确。

FYI, I am using sqlite3 from within Qt (using Qtsql API) which I understand supports serialized mode by default: https://www.sqlite.org/threadsafe.html

我想在多个线程中使用相同的连接名称的原因是因为当我尝试在多个线程上使用不同的连接到同一个数据库并执行 SELECT / INSERT / UPDATE 时,我得到 database locked 问题相当频繁。但是,在多个线程中使用相同的连接时,这个问题就完全解决了。

请指导。

此致,

索拉布·甘地

文档不仅劝阻它,还明确指出你不能这样做(强调我的):

A connection can only be used from within the thread that created it.

所以,不,您不能使用来自多个线程的一个连接。它可能碰巧起作用,但不能保证起作用,并且您正在调用相当于未定义行为的东西。请注意,它也不能保证会崩溃。

您需要:

  1. 在你这边序列化对数据库的访问,或者

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