c++ - 不同线程中的 qt 同时 MySQL 查询 = 崩溃

标签 c++ mysql multithreading qt

我有一个用 C++ 编写的多线程 Qt5 应用程序,其中每个线程都写入同一个数据库。

我跨线程共享同一个数据库 QSqlDatabase 变量,但每个线程都创建自己的查询。我经常遇到崩溃,我在崩溃时捕获了以下信息:

Driver error [QMYSQL3: Unable to store statement results]
Database error [Commands out of sync; you can't run this command now]
Type [2]
Number [2014]

首先,我可以在多个线程中同时进行 MySQL 查询吗?如果是这样,我是否需要使用互斥体来保护 SQL 调用?或者我需要发布更多信息....


更新:我有一个单独的 DBManager 线程,它处理打开/关闭数据库和简单的数据库写入。我这样做是因为我的数据库经常脱机,而且我不希望其他线程在数据库打开失败时挂起长达 2 分钟。不,我有更多的线程做报告,并且必须从数据库中检索大量数据。

如下所述,不允许跨线程共享数据库句柄。所以现在也许这更像是一个设计问题——处理这种情况的最佳方法是什么?我不希望每个执行数据库访问的线程都尝试自己打开并等待 2 分钟以防数据库离线

最佳答案

阅读 SQL 模块的文档,特别是 threads section这表明每个连接只能在创建它的线程中使用。

因此添加互斥锁还不够好,您将不得不在每个线程中创建一个新的连接对象,或者将所需的数据传入/传出执行所有数据库查询的专用线程。

关于c++ - 不同线程中的 qt 同时 MySQL 查询 = 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23201320/

相关文章:

c++ - 从嵌套迭代的列表中删除

mysql - 返回带有连接数据的 MAX 选择记录

php - pdo 使用 avg 列出前 5 名?

c# - 在不阻塞控制台输出的情况下循环

c# - .net 中任务的说明

c++ - 有操作系统和没有操作系统的两个空 main{} 程序有什么区别?

c++ - 关于windows iocp的一个问题

c++ - 如何在 C++ 中移动到上一行?

java - 具有本地数据库的小型 Java 应用程序?使用哪个数据库?

使用计数器的 Java 数据竞争示例