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

Posted

技术标签:

【中文标题】在多个 qt 线程中使用单个 QSqlDatabase 连接【英文标题】:Using a single QSqlDatabase connection in multiple qt threads 【发布时间】:2016-07-28 13:13:53 【问题描述】:

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

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

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

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

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

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

请提供相同的指导。

问候,

索拉巴·甘地

【问题讨论】:

也许可以创建一个包装类,它有一些插槽可以插入/更新/删除并将其放在自己的线程中 【参考方案1】:

文档不仅不鼓励它,它还直截了当地声明你不能这样做(强调我的):

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

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

您需要:

    序列化你端对数据库的访问,或者

    更改连接参数,使锁不会拒绝查询,而是在数据库可用之前阻塞。我不太确定database locked“问题”是什么:如果您实际使用多个连接,您永远不会看到该错误代码(我认为它是 SQLITE_LOCKED)。 Sqlite 3 可以轻松地从多个线程中使用,除了启用多线程和使用单独的连接之外,您不需要任何努力。

【讨论】:

以上是关于在多个 qt 线程中使用单个 QSqlDatabase 连接的主要内容,如果未能解决你的问题,请参考以下文章

Qt 4.7:TCP线程,数据传输导致内存泄漏

Qt:如何在模型/视图设置中同步对来自多个线程的数据的访问?

单个 Qt 应用程序可以在多个 X 显示器上打开窗口吗?

在线程中选择()系统调用?

拥有多个线程池与单个线程池相比有啥好处?

Qt入门教程QObject篇重入性和线程安全