在Qt应用程序中,多线程中的SQL连接

3

在Qt应用程序中如何创建并使用多个与SQL数据库的连接?

我已经阅读了文档,其中提到:

一个连接只能在创建它的线程中使用。

那么如何在不同线程中分离出多个连接呢?


1
需要连接的每个线程都创建一个连接? - Mat
3个回答

6

每个线程都应该创建一个数据库连接。在每个线程中使用不同的连接名称作为参数,使用QSqlDatabase::addDatabase()为每个线程创建QSqlDatabase实例。静态的addDatabase函数是线程安全的,并且可以在不同的线程中调用。


QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL", __func__); - Ilya Matveychikov

2
我该如何在使用Qt编写的程序中,创建并在不同线程中使用多个连接到SQL数据库的方法?
// general worker init slot
DbWorker::init()
{
    this->db = QSqlDatabase::addDatabase("QSQLITE", dbName);
    db.setDatabaseName(dbPath);
    db.open();
}

当你的主类或任何地方有以下代码:

DbWorker w1 = new DbWorker;
w1.setDbName("mem_db");
w1.setDbPath(":memory:");
QThread* t1 = new QThread(this);
w1->moveToThread(t1);
connect(t1, SIGNAL(started()), w1, SLOT(init()));
t1->start();

DbWorker w2 = new DbWorker;
w1.setDbName("file_db");
w1.setDbPath("~/usr/foo.db");
QThread* t2 = new QThread(this);
w1->moveToThread(t1);
connect(t2, SIGNAL(started()), w2, SLOT(init()));
t1->start();

你在线程1中有内存连接,在线程2中有文件连接。唯一需要管理的是,如果是GUI应用程序,则将数据提取到GUI线程。


是的,这是一个GUI应用程序(GUI线程从数据库读取数据,工作线程从数据库读取和写入数据)。现在我只使用一个连接来处理两个线程,有时会发生查询从GUI线程读取的数据出现在工作线程的查询结果中(可能已损坏或无效)。谢谢! - Hardwired
请注意,“非 GUI 线程”不允许访问 GUI 元素。使用“信号/槽”共享数据,您就可以顺利进行了。 - Zaiborg

-2

请跟随VoidRealms在YouTube上的this教程。他对SQL连接、模型以及关于Qt的许多其他内容都有很好的解释。

如果您在观看后仍需要更多帮助,我很乐意为您发送一个样例代码供您测试。


1
花了10分钟观看整个视频。完全没有涉及多线程场景。只包含使用Qt建立连接的基础知识。 - Evan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接