首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多个线程使用QSqlQuery

从多个线程使用QSqlQuery
EN

Stack Overflow用户
提问于 2017-11-23 14:11:48
回答 3查看 8.8K关注 0票数 7

我有很多C++11线程正在运行,这些线程在某个时候都需要数据库访问。总的来说,我确实对数据库连接进行了初始化,并打开了数据库。Qt文档说查询不是线程安全,所以在线程中存在QSqlQuery之前,我使用全局互斥。

这是可行的,但这是肯定的工作,还是我遇到了问题在某个时候?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-24 13:03:57

文档告诉我们,

只能从创建连接的线程中使用连接。不支持在线程之间移动连接或从其他线程创建查询。

因此,每个线程确实需要一个连接。我通过根据线程生成动态名称来解决这个问题:

代码语言:javascript
复制
auto name = "my_db_" + QString::number((quint64)QThread::currentThread(), 16);
if(QSqlDatabase::contains(name))
    return QSqlDatabase::database(name);
else {
    auto db = QSqlDatabase::addDatabase( "QSQLITE", name);
    // open the database, setup tables, etc.
    return db;
}

如果您使用的线程不是由Qt管理的,请使用QThreadStorage生成每个线程的名称:

代码语言:javascript
复制
// must be static, to be the same for all threads
static QThreadStorage<QString> storage;

QString name;
if(storage.hasLocalData())
    name = storage.localData();
else {
    //simple way to get a random name
    name = "my_db_" + QUuid::createUuid().toString();
    storage.setLocalData(name);
}

重要: Sqlite可能处理多线程,也可能无法处理多线程。见https://sqlite.org/threadsafe.html。据我所知,嵌入到Qt中的sqlite是threadsafe,因为这是默认的,而且我无法在源代码中找到禁用它的任何标志。但是,如果您使用的是不同的sqlite版本,请让shure它实际上支持线程。

票数 12
EN

Stack Overflow用户

发布于 2017-11-23 14:14:53

您可以使用SQL函数编写类,并使用信号插槽进行查询并从数据库中获取结果。

它是线程安全的,也不需要使用mutex

票数 1
EN

Stack Overflow用户

发布于 2017-11-24 10:59:41

你选择的不是很好的方法。应该使用共享QSqlDatabase对象而不是QSqlQuery。请检查多线程数据库访问的下一个例子。如果你不清楚的话,请告诉我。会解释得更多。

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47457478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档