门户
书籍
教程
论坛
问答
下载
签到
个人空间
帐号
自动登录
找回密码
密码
登录
立即注册
账号
自动登录
找回密码
密码
登录
立即注册
请绘制轨迹完成人机验证
由vaptcha提供技术支持
登录
注册
搜索
搜索
搜索
热搜
qml
quick
串口
输入中文
数据库
arm
百度地图
qt聊天
QT安装
安装
多窗口
中文乱码
聊天
局域网
鼠标
QT
图片
乱码
rs485通讯
多线程
android
多文档编辑器
本版
用户
本版
用户
【HUX】问题互助平台
博客
动态
好友
帖子
收藏
道具
勋章
任务
淘帖
动态
日志
相册
分享
记录
留言板
群组
门户
导读
排行榜
设置
我的收藏
退出
Qt开源社区
›
精华区(请在“有问必答”发帖)
›
有问必答
›
数据处理
›
求教,怎样用多线程怎样向MYSQL数据库中写入数据 ...
发布主题
返回列表
求教,怎样用多线程怎样向MYSQL数据库中写入数据
2
回复
7743
查看
[复制链接]
1363386323
当前离线
积分
151
1363386323
累计签到:8 天
连续签到:1 天
来源:
2014-6-6 16:43:59
显示全部楼层
|
阅读模式
8
Qter豆
多线程怎样向MYSQL数据库中写入数据,弄了几天还没弄好,要疯了。再此向大侠们请教 !!
真的很急,因为在最近在开发这个程序!
#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
=
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"
Thread
::
Thread
(
QObject
*
parent
)
:
QThread
(
parent
)
{
}
void
Thread
::
run
()
{
begin
();
}
//为每个线程创建一个连接名
void
Thread
::
set
(
int
a
)
{
connectionName
=
QString
::
number
(
a
);
}
void
Thread
::
connectionDatabase
(
QString
dbName
)
{
QSqlDatabase
db
=
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
=
1
;
i
<=
10000
;
i
++){
query
.
exec
(
"insert
into
student
values
(1)"
);
}
db
.
commit
();
//提交事物
}
备注:提 前已在MYSQL数据库中创建了learnsql数据库,和student表
编译执行时通过了,可却数据写不进去,不知道哪出了问题;
不管怎样,只要大侠们能告诉我怎样用多线程在MYSQL数据库中写入数据就行了
最佳答案
imlison
查看完整内容
抱歉,现在才看到这个帖子,因为最近都很少上论坛。 你这段代码写法是有问题的,某些情况下会导致程序崩溃。 原因:虽然Qt数据库很多方法是线程安全的,但是在加载数据库plugin上却不安全,会导致竞争从而崩溃。 解决:把数据库连接部分用线程同步相关方法保护起来。 下面的代码是在你的基础上修改而来。亲测可行。 Thread.hThread.cppmain.cpp ...
相关帖子
Ubuntu下32位QT5.4.2连接不上mysql问题
qml程序在windows发布,不显示界面
Qt数据库集成应用封装
Qt WebEngine示例程序的浏览器,如何播放flash
给l控件英文字体指定大小,拿到开发板上加参数-fn unifont...
第22篇 Qt5之数据库(二)安装MySQL数据库
我想在qt下编写一个tftp客户端的程序,请问有什么建议吗?
Qt自带的数据库Sqlite有可视化软件吗?
第23篇 Qt5之数据库(三)利用QSqlQuery类执行SQL语句
第24篇 Qt5之数据库(四)SQL查询模型QSqlQueryModel
第25篇 Qt5之数据库(五)SQL表格模型QSqlTableModel
第26篇 Qt5之数据库(六)SQL关系表格模型QSqlRelationalTableModel
第27篇 Qt5之XML(一)使用DOM读取XML文档
如何在QT的mainwindow中输入数据然后,且将值返回主程序
如何利用读写锁的dll库对SQLite加读锁
想用QT做一个预约挂号系统作为毕业设计,大家给点小建议
QT项目使用mysql没有事务处理功能
KS13-02 多线程应用中如何与主界面通信
QT调试输出乱码,如何解决?
回复
使用道具
举报
imlison
当前离线
积分
27
imlison
累计签到:6 天
连续签到:1 天
2014-6-6 16:44:00
显示全部楼层
1363386323 发表于 2014-6-6 18:26
@imlison
帮帮我,怎样用多线程向MYSQL数据库中写入数据,前提是要用事物
抱歉,现在才看到这个帖子,因为最近都很少上论坛。
你这段代码写法是有问题的,某些情况下会导致程序崩溃。
原因:虽然Qt数据库很多方法是线程安全的,但是在加载数据库plugin上却不安全,会导致竞争从而崩溃。
解决:把数据库连接部分用线程同步相关方法保护起来。
下面的代码是在你的基础上修改而来。亲测可行。
Thread.h
#ifndef THREAD_H
#define THREAD_H
#include <QThread>
#include <QMutex>
class Thread : public QThread
{
Q_OBJECT
public:
explicit Thread(QObject *parent = 0);
~Thread();
void set(int a);
protected:
void run();
private:
bool connectDatabase(QString dbName);
bool begin();
private:
QString connectionName;
static QMutex mutex_log;
static QMutex mutex_db;
signals:
public slots:
};
#endif // THREAD_H
复制代码
Thread.cpp
#include "Thread.h"
#include <QSqlDatabase>
#include <QSqlDriver>
#include <QSqlQuery>
#include <QSqlError>
#include <QMutexLocker>
#include <QDebug>
QMutex Thread::mutex_log;
QMutex Thread::mutex_db;
#define PRINT(msg) do\
{\
QMutexLocker lock(&mutex_log);\
qDebug() << __FILE__ << ":" << __LINE__ << " -> " << (msg);\
}while(0)
Thread::Thread(QObject *parent) :
QThread(parent)
{
}
Thread::~Thread()
{
}
void Thread::set(int a)
{
connectionName = QString::number(a);
}
bool Thread::connectDatabase(QString dbName)
{
QMutexLocker lock(&mutex_db);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", connectionName);
db.setHostName("127.0.0.1");
db.setDatabaseName(dbName);
db.setUserName("root");
db.setPassword("");
if(!db.open())
{
PRINT(QString("db open fail: %1").arg(db.lastError().text()));
return false;
}
return true;
}
bool Thread::begin()
{
QString dbName = "learnsql";
connectDatabase(dbName);
QSqlDatabase db = QSqlDatabase::database(connectionName);
if( !db.isValid() )
{
return false;
}
db.transaction();
PRINT(QString("进入事务"));
QSqlQuery query(db);
for(int i=0; i<10; ++i)
{
query.prepare("INSERT INTO student VALUES(:value)");
query.bindValue(":value",i);
if( !query.exec() )
{
PRINT(QString("query error: %1").arg(query.lastError().text()));
continue;
}
}
db.commit();
PRINT(QString("退出事务"));
return true;
}
void Thread::run()
{
begin();
}
复制代码
main.cpp
#include <QCoreApplication>
#include "Thread.h"
#include <QVector>
#define THREAD_NUM 10
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QVector<Thread *> threads;
for(int i=0; i<THREAD_NUM; ++i)
{
Thread *thr = new Thread;
thr->set(i);
thr->start();
threads.push_back(thr);
}
foreach (Thread *thr, threads) {
thr->wait();
}
foreach (Thread *thr, threads) {
delete thr;
}
threads.clear();
qDebug("程序执行完毕");
return a.exec();
}
复制代码
回复
使用道具
举报
1363386323
当前离线
积分
151
1363386323
累计签到:8 天
连续签到:1 天
2014-6-6 18:26:08
显示全部楼层
@imlison
帮帮我,怎样用多线程向MYSQL数据库中写入数据,前提是要用事物
回复
使用道具
举报
返回列表
发表新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满)
我知道了