我很担心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()生成和管理。
所以,既然这段代码可以用,或者我会遇到它 麻烦这样做?
欢迎任何帮助,文档或解释! 谢谢。
答案 0 :(得分:6)
上面的代码很好,因为QSqlQuery creates its own QSqlDatabase。如果它引用由_db
创建的db()
,则会出现问题。缺点是它实际上并没有做任何事情。
QSqlDatabase不是QObject,但它有一个driver,它是一个QObject,因此有thread affinity。
如果创建QSqlDatabases的负载过高,请创建worker threads来维护自己的连接。然后将查询分派给这些线程,而不是创建新线程,从而创建新连接。