在QT中多线程访问mysql数据库的问题(已解决)

一、可以便捷的使用多线程并发类QtConcurrent解决

关于类的使用请参考博客:便捷的使用多线程并发类QtConcurrent解决Qt在槽函数中执行耗时操作导致界面卡住的问题_吻等离子的博客-CSDN博客

二、出现问题

QT使用全局db,提示QSqlDatabasePrivate::database: requested database does not belong to the calling thread.

2.1 问题原因

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

所以解决办法就是在线程中创建,在线程中释放

2.2需要注意的问题

释放的时候需要注意

 在断开与数据库的链接时,必须释放该连接的所有查询,即删除所有与该连接有关的query;同时在释放该连接时,需要先获取该连接的连接名,然后先关闭当前数据库,并将当前数据库使用默认构造函数覆盖,最后再移除当前连接。

三、直接上代码
 

void MainWindow::arrive_msg_handl(QMQTT::Message msg)
{

    //在线程中打开数据库的操作
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");  //连接的MYSQL的数据库驱动
    db.setHostName("localhost");
    db.setPort(3306);
    db.setDatabaseName("**");//数据库的名字手动创建
    db.setUserName("root");
    db.setPassword("***");
    bool ok = db.open();

    if (ok){
         qDebug()<<"连接成功";
    }
    else {
        qDebug()<<"不能连接"<<"connect to mysql error"<

你可能感兴趣的:(qt,数据库,开发语言)