qt数据库多线程问题的解决(QSqlDatabase只能在创建它的线程中使用)

111 篇文章 9 订阅

    Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的

    假设有如下代码:

bool openDatabase()
{
    QSqlDatabase db;
    QString connectionName = "sqlite";
    db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
    db.setDatabaseName("/jyxtec.db");
    if (db.open())
        return true;
    else
        return false;
}


void testQuery()
{
    QSqlQuery query(QSqlDatabase::database("sqlite"));
    query.exec("SELECT * from t_test");
    // ..........
}

    这里的testQuery()是不支持多线程调用的,只能在调用OpenDatabase()的线程中使用.否则很容易段错误。

解决方法有两种:

   1)每个调用testQuery的线程中创建不同connectionName的QSqlDatabase

比如线程A

QSqlDatabase::addDatabase("QSQLITE", "A");

QSqlQuery query(QSqlDatabase::database("A"));

线程B

QSqlDatabase::addDatabase("QSQLITE", "B");

QSqlQuery query(QSqlDatabase::database("B"));

   2)实现一个数据库线程池,创建N个不同connectionName的QSqlDatabase,所有的query命令都放到这个线程池中处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值