Qt多线程操作Sqlite数据库2-多线程操作不同的连接

37 篇文章 16 订阅
8 篇文章 1 订阅

目录

一、QSqlDatabase概述

二、QSqlDatabase模块的使用

三、多线程操作不同的链接

1、testsqldatabase.cpp

2、thread1.cpp

3、thread2.cpp

四、总结


一、QSqlDatabase概述

       QSqlDatabase提供了一系列的接口用于访问操作数据库,包括连接数据库,输入sql语句等。
QSqlDatabase的实例表示着一个对数据库的连接。该连接通过一个受支持的数据库驱动程序(从QSqlDriver派生)提供对数据库的访问。另外,可以从QSqlDriver子类化自己的数据库驱动程序。(如何创建自己的驱动,详见其他文档)Qt支持的数据库有很多,自己首先接触到的是QODBC(用于sql server)。另外还有QSQLITE、QDB2、QIBASE、QMYSQL等。

二、QSqlDatabase模块的使用

QSqlDatabase类处理与数据库的连接,要使用这个类,头文件需要导入QSqlDatabase库:

#include <QSqlDatabase>

在qmake.pro文件中加入SQL数据库支持:

QT += sql

    这个类提供了以下公共方法:QSqlDatabase::addDatabase、QSqlDatabase::removeDatabase和QSqlDatabase::database函数都是线程安全的。但是open不是线程安全的,所以在open时需要加上锁。

三、多线程操作不同的链接

1、testsqldatabase.cpp

#include "testqtdatabase.h"
#include "thread1.h"
#include "thread2.h"
#include <QSQLDatabase>
#include <QSqlQuery>
#include <QSqlError>

testqtdatabase::testqtdatabase(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{





	ui.setupUi(this);
	Thread1 *t1=new Thread1(NULL);
	t1->start();

	Thread2 *t2=new Thread2(NULL);
	t2->start();

	m_t1=t1;
	m_t2=t2;

}

testqtdatabase::~testqtdatabase()
{
	((Thread1*)m_t1)->setStop();
	((Thread2*)m_t2)->setStop();
	m_t1->wait();
	m_t2->wait();


	

	
}

2、thread1.cpp

#include "thread1.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QMutex>
QMutex g_mutex;
Thread1::Thread1(QObject *parent)
	: QThread(parent)
{
	m_bStop=false;
}

Thread1::~Thread1()
{
	
}

void Thread1::setStop()
{
	m_bStop = true;
}

void Thread1::run()
{

	{
		QMutexLocker locker(&g_mutex);
		m_db = new QSqlDatabase();
		*m_db=QSqlDatabase::addDatabase("QSQLITE","test1");
		QSqlDatabase & db=*m_db;
		db.setDatabaseName("test.db");
		bool b=db.open();
	}

	while(true)
	{
		if(m_bStop)
		{
			break;
		}
		{

		
		QSqlQuery query(*m_db);
		if(!query.exec("select * from user;"))
		{
			QSqlError error = query.lastError();
		}


		QString result="";
		while(query.next()){
			result+=query.value(0).toString()+' ';
			result+='\n';
		}
		}
	
	}

	QSqlDatabase::removeDatabase("test1");
	delete m_db;
}

3、thread2.cpp

#include "thread2.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QMutex>
extern QMutex g_mutex;
Thread2::Thread2(QObject *parent)
	: QThread(parent)
{
	 m_bStop=false;
}

Thread2::~Thread2()
{
	
}

void Thread2::setStop()
{
	m_bStop = true;
}

void Thread2::run()
{
	{
		QMutexLocker locker(&g_mutex);
		 m_db = new QSqlDatabase();
		*m_db=QSqlDatabase::addDatabase("QSQLITE","test2");

		m_db->setDatabaseName("test.db");
		bool b=m_db->open();
	}


	while(true)
	{
		if(m_bStop)
			break;
		{

		
		
		QSqlQuery query(*m_db);
		if(!query.exec("select * from user;"))
		{
			QSqlError error = query.lastError();
		}


		QString result="";
		while(query.next()){
			result+=query.value(0).toString()+' ';
			result+='\n';
		}
		}

	}

	QSqlDatabase::removeDatabase("test2");
	delete m_db;
}

四、总结

       Sqlite数据库是支持多线程读的,但是只支持一个线程写,所以如果要进行多线程读写的话,还需要加上读写锁。open函数不是线程安全的,所以要加锁,如果不加的话有时会崩溃的。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kupeThinkPoem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值