gpt4 book ai didi

c++ - 在多线程程序中正确使用 QSqlDatabase

转载 作者:IT老高 更新时间:2023-10-28 22:14:56 25 4
gpt4 key购买 nike

基于 Qt 文档:

A connection can only be used from within the thread that created it. Moving connections between threads or creating queries from a different thread is not supported.

困扰我的问题是,当我复制构建数据库实例时会发生什么。例如,这里是主线程中的代码:

int main(int argc, char** argv) {
...
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "DB1");
db.setHostName("localhost");
...

这是工作线程线程中的连接:

void MyThread::run() {
QSqlDatabase db(QSqlDatabase::database("DB1"));
if (db.open()) {
...
}

这个线程安全吗?通常,这样的操作在 C++ 中是安全的,但由于 QT 使用隐式共享和线程关联,我不再确定。

他们说:一个连接只能在创建它的线程中使用,但这是什么意思? 是创建连接的QSqlDatabase::addDatabase点还是实际调用open()函数时的位置。

更新:

在 Laszlo Papp 的回答之后,并最终查看了 Qt 源代码,我必须说 Qt 这部分的设计在我看来是有缺陷的。

如果我理解正确,QSqlDatabase 在底层使用隐式共享,但不幸的是它不是真正的隐式共享,因为 QSqlDatabase 实例的复制构造函数不会在需要时创建共享数据的新实例。更糟糕的是,您不能创建临时连接,而是必须使用静态方法 addDatabase/removeDatabase,在这种情况下,您必须同步线程以避免名称冲突。

这当然使得在 QtConcurrent 中使用 QSqlDatabase 变得非常困难,特别是如果连接应该深埋在某些抽象之后。由于我们不知道代码将在哪个线程上运行,因此我们无法在两个调用之间保持连接打开。如果我们想生成动态数量的任务,我们需要确保任务不使用相同的数据库名称。

所有这些让我想知道设计目标以及隐式共享是否适合这种特殊情况。恕我直言,更好的解决方案是让复制构造函数真正完成它并为您制作连接拷贝。那些不想拥有私有(private)/临时拷贝的人,仍然可以使用 addDatebase/removeDatabase,在这种情况下,方法 database() 需要修改以返回引用。

最佳答案

They say: A connection can only be used from within the thread that created it, but what does that mean? Is QSqlDatabase::addDatabase point where connection is created or it actually when open() function is called.

前者。见 documentation详情:

The QSqlDatabase class represents a connection to a database.

The QSqlDatabase class provides an interface for accessing a database through a connection. An instance of QSqlDatabase represents the connection. The connection provides access to the database via one of the supported database drivers, which are derived from QSqlDriver. Alternatively, you can subclass your own database driver from QSqlDriver. See How to Write Your Own Database Driver for more information.

Create a connection (i.e., an instance of QSqlDatabase) by calling one of the static addDatabase() functions...

最后一句话应该可以解决您的疑虑。

关于c++ - 在多线程程序中正确使用 QSqlDatabase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20793689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com