sql模块和多线程应用程序

QSql module and multithreaded application

本文关键字:应用程序 多线程 模块 sql      更新时间:2023-10-16

我对Sql模块如何在Qt中与多线程应用程序一起工作感到困扰。http://doc.qt.io/qt-5/threads-modules.html#threads-and-the-sql-module清楚地说明"一个连接只能在创建它的线程内使用"。

然而,我写的这段代码是有效的:

#include <QCoreApplication>
#include <QSqlQuery>
#include <QtConcurrentRun>
void    req()
{
  QSqlQuery q("INSERT INTO users (username) VALUES ("test")");
}
void    db()
{
  QSqlDatabase _db;
  _db = QSqlDatabase::addDatabase("QMYSQL");
  _db.setDatabaseName("dbname");
  _db.setHostName("host");
  _db.setUserName("username");
  _db.setPassword("password");
  if (_db.open())
    std::cout << "Ok" << std::endl;
  else
    std::cout << "Error" << std::endl;
}
int     main(int ac, char **av)
{
  QCoreApplication app(ac, av);
  QtConcurrent::run(db);
  sleep(1);
  QtConcurrent::run(req);
  return app.exec();
}

我的应用程序设计需要多个线程与数据库交互。这些线程由QtConcurrent::run()派生和管理。

那么,既然这段代码可以工作,我应该使用它还是会遇到

欢迎任何帮助,文档或解释!谢谢你。

上面的代码没问题,因为QSqlQuery创建了它自己的 QSqlDatabase。如果它引用db()创建的_db,这将是一个问题。缺点是它实际上没有任何事情。

QSqlDatabase不是QObject,但它有一个驱动程序,该驱动程序是QObject,因此具有线程亲和性。

如果创建qsqldatabase的负载是禁止的,创建工作线程维护自己的连接。然后将查询分派给这些线程,而不是创建新的线程和新的连接。