#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)
{
//数据 *** 作语句
}
}
}
你在一个函数里实现数据库 *** 作。然后线程 *** 作数据库都调用他
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)