请教如何进行多线程连接数据库并写入数据

请教如何进行多线程连接数据库并写入数据,第1张

#include <QCoreApplication>

#include "thread.h"

#include <QVector>

#include <QDebug>

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv)

QVector<Thread*>vector

Thread *thread

//创建多个线程,并start

for(int i=0i<10i++){

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"

Thread::Thread(QObject *parent) : QThread(parent)

{

}

void Thread::run()

{

begin()

}

//为每个线程创建一个连接名

void Thread::set(int a)

{

connectionName=QString::number(a)

}

void Thread::connectionDatabase(QString dbName)

{

QSqlDatabasedb=QSqlDatabase::addDatabase("QMYSQL",connectionName)

db.setHostName("localhost")

db.setDatabaseName(dbName)

db.setUserName("root")

db.setPassword("")

if(!db.open())

qDebug()<<"db open fail"

}

void Thread::begin()

{

QString dbName="learnsql"

connectionDatabase(dbName)

QSqlDatabase db=QSqlDatabase::database(connectionName)

db.transaction()//开启事物

QSqlQuery query(db)

//向表student中插入10000条数据

for(int i=1i<=10000i++){

query.exec("insert into student values(1)")

}

db.commit()//提交事物

}

首先,你的确定数据的主键是否可以使用序列自增。

如果可以那么你可以在插入数据的时候获取序列里的值,这样数据就不会重复了。

其次,可以创建一个公共方法,进行数据的插入 *** 作,并且方法类型声明为 static synchronized

类型,这样基本上就不会出现数据重复的现象了

最后,要看你是怎么获得待插入源数据了,这个获得数据源的方法也做成static synchronized的公

共方法。

1共用一个连接就可以

2其实一样可以用lock实现,把数据库 *** 作写成一个函数,函数内加lock。c#会安排他们排队

比如

private static object privateObjectLock = new object()

public static xxoo()

{

lock(privateObjectLock)

{

//数据 *** 作语句

}

}

}

你在一个函数里实现数据库 *** 作。然后线程 *** 作数据库都调用他


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6705044.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存