zoukankan      html  css  js  c++  java
  • qt数据库多线程问题的解决(QSqlDatabase只能在创建它的线程中使用)

    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命令都放到这个线程池中处理。

    作者:帅得不敢出门  程序员群:31843264

    http://blog.chinaunix.net/uid-20680966-id-4779621.html

  • 相关阅读:
    Matlab之画图
    Evaluation
    Matlab之文件读写
    Matlab之cell使用
    Windows装机指南
    C之文件读写
    Linux之用户管理
    linux和Windows下文本格式转换
    round()
    pow()
  • 原文地址:https://www.cnblogs.com/findumars/p/5595571.html
Copyright © 2011-2022 走看看