今天热门
热点:

Qt多线程连接mysql数据库,有时不能打开,qtmysql


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QVector<Thread*> vector;
    Thread *thread;

    //创建多个线程,并start
    for(int i=0;i<10;i++){
        thread=new Thread();
        vector.append(thread);
        thread->set(i);
        thread->start();
    }

    //等待所有线程执行完,然后删除线程
    foreach(thread,vector){
    thread->wait();
    }
    foreach(thread,vector){
    delete thread;
    }

    return a.exec();
}

#include "thread.h"
#include <QSqlQuery>
#include <QDebug>
#include <QMutex>
Thread::Thread(QObject *parent) : QThread(parent)
{
}

void Thread::run()
{
    begin();
}

//为每个线程创建一个连接名
void Thread::set(int a)
{
    connectionName=QString::number(a)+"aaaa";
}

void Thread::connectionDatabase(QString dbName)
{
    QMutex mutex;
    mutex.lock();
    QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL",connectionName);
    db.setHostName("localhost");
    db.setDatabaseName("userdb");
    db.setUserName("root");
    db.setPassword("123456");

    if(!db.open())
        qDebug()<<"db open fail";
    else
        qDebug() << "db open=====";
    mutex.unlock();
}

void Thread::begin()
{
    connectionDatabase("");

    QSqlDatabase db=QSqlDatabase::database(connectionName);

    QSqlQuery query(db);

    query.exec("SELECT * FROM data2_table where pid between 1 and 100;");
}

db open fail
db open fail
db open fail
db open fail
db open fail
db open fail
db open fail
db open fail
db open=====
db open=====
不是都能打开,有时软件还崩溃,好像用sqlite没出现这些问题。

解决方案

Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的,LZ这里用的就是这种方式
这里的begin()是不支持多线程调用的,只能在调用connectionDatabase()的线程中使用.否则很容易段错误。
LZ可以为每个调用begin的线程中创建不同connectionName的QSqlDatabase
QSqlDatabase::addDatabase(driver,connectionName)添加一个connectionName标识就行
比如线程A
QSqlDatabase::addDatabase("QSQLITE", "A");
QSqlQuery query(QSqlDatabase::database("A"));
线程B
QSqlDatabase::addDatabase("QSQLITE", "B");
QSqlQuery query(QSqlDatabase::database("B"));
最后祝楼主成功!!

www.zrccd.nettrue/topics/20180124/107971.htmlTechArticleQt多线程连接mysql数据库,有时不能打开,qtmysql intmain(intargc,char*argv[]) { QApplicationa(argc,argv); QVectorThread*vector; Thread*thread; //创建多个线程,并start for(inti=0;i10;i++){ thread=newThread(); vector.app...

相关文章

    暂无相关文章

用户评论

大家都在看