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没出现这些问题。
解决方案
这里的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"));
最后祝楼主成功!!
用户评论