Qt多线程操作sqlite数据库

news2024/9/30 15:20:02

问题

就是为了多线程操作sqlite数据库,为什么,因为数据库是耗时的操作,一条数据的插入,差不多200ms,如果是数据插入多了,界面会有明显的卡顿,因此必须,多线程操作数据库。
问题是这样的:
在这里插入图片描述

插入数据之后,接着更新界面;然而,插入数据是比较耗时的操作,尤其插入数据多的情况下,这时,界面卡的就更为明显;让用户体验很不好。

多线程同步的概念:

即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,
而其他线程又处于等待状态,实现线程同步的方法有很多,临界区对象就是其中一种。
就是一段代码段希望被保护起来,在执行过程中不能被其它线程打断,以保证计算结果的完整性,这就是线程同步的概念。

SQLite的多连接支持

SQLite支持从多个连接同时读写数据库。这意味着多个应用程序或同一个应用程序的多个实例可以同时存取同一个数据库文件。SQLite使用读/写锁定来控制数据库访问,以确保数据的一致性和完整性。
读操作:多个连接可以同时获得并保持共享锁(读锁),从而允许它们同时从数据库中读取数据。
写操作:写操作需要获得独占锁(写锁),这会阻塞其他读写操作,直到写操作完成并释放锁。因此,在同一时间内,SQLite只能支持一个写连接。

单连接与多连接并发对比

单连接:在单连接情况下,SQLite的性能通常很好,因为没有锁竞争的问题。但是,这限制了应用程序的并发能力。
多连接:多连接允许更高的并发性,但同时也带来了锁竞争和性能下降的风险。特别是在高并发环境下,写操作的性能可能会受到严重影响。

综合方案

综合上面的观点,我们就用了锁,锁的开销也不大,对写进行加写锁,写锁,就是保存所有连接只有一个可写;读加读锁,读锁,就是有写的时间,锁定,如果存在读或者无操作的情况下,就可以解锁。
在这里插入图片描述

解决过程

下面通过一个完整的例子,讲解这一个过程。
首先数据库操作,有增加、删除、查询等操作,除了这些常规数据库操作以外,还要加锁,就是为了防止写冲突,读写冲突,通过锁就解决了这些问题,想想,锁还是挺厉害的一个东西。

#pragma execution_character_set("utf-8")
#include "sqliteDb.h"
#include <QDebug>
#include <QCoreApplication>
#include <QThread>
#include <QDateTime>
QReadWriteLock SqliteDb::s_readWriteLock;
int SqliteDb::s_score = 0;
SqliteDb::SqliteDb(QObject *parent)
{
   
}
SqliteDb::~SqliteDb()
{
   
}
void SqliteDb::connectDb(QString &dbName)
{
   
    // 创建并打开数据库连接
    m_db = QSqlDatabase::addDatabase("QSQLITE", dbName);
    m_db.setDatabaseName(QCoreApplication::applicationDirPath()+"/student.db");
    if (!m_db.open()) {
   
        qDebug() << "无法打开数据库!";
    }
}
void SqliteDb::insertTableStudent(Student &student)
{
   
    qDebug()<<"enter function insertTableStudent currentThreadId=" << QThread::currentThreadId()
           <<" currentTime="<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
    QWriteLocker lock(&s_readWriteLock);
    // 2. 创建QSqlQuery对象
    QSqlQuery query(m_db);
    // 3. 准备SQL语句
    query.prepare("insert into student(seq, name, score) values(:seq, :name, :score);");
    // 4. 绑定数据
    query.bindValue(":seq", student.seq);
    query.bindValue(":name", student.name);
    query.bindValue(":score"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2179951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【无人机设计与技术】四旋翼无人机的建模

摘要 本项目的目标是通过 Simulink 建模和仿真&#xff0c;研究四旋翼无人机的建模、姿态控制、定点位置控制及航点规划功能。无人机建模包含了动力单元模型、控制效率模型和刚体模型&#xff0c;并运用这些模型实现了姿态控制和位置控制。姿态控制为无人机的平稳飞行提供基础…

Google Tag Manager - 服务器端代码植入

服务端跟踪出现的原因&#xff1b; 服务端跟踪主要有两个原因&#xff1a; 法律法规日趋严格&#xff0c;如GDPR&#xff0c;CCPA的的实施&#xff0c;对用户隐私保护越加严格&#xff0c;服务端跟踪可以让你对数据有完整的控制&#xff0c;你可以控制哪些数据可以发送给第三方…

墙绘交易平台设计:SpringBoot技术要点

3 系统分析 当用户确定开发一款程序时&#xff0c;是需要遵循下面的顺序进行工作&#xff0c;概括为&#xff1a;系统分析–>系统设计–>系统开发–>系统测试&#xff0c;无论这个过程是否有变更或者迭代&#xff0c;都是按照这样的顺序开展工作的。系统分析就是分析系…

YOLOv11训练自己的数据集(从代码下载到实例测试)

文章目录 前言一、YOLOv11模型结构图二、环境搭建三、构建数据集四、修改配置文件①数据集文件配置②模型文件配置③训练文件配置 五、模型训练和测试模型训练模型验证模型推理 总结 前言 提示&#xff1a;本文是YOLOv11训练自己数据集的记录教程&#xff0c;需要大家在本地已…

PC流量转移动流量,提升网盘拉新收益

首先&#xff0c;以夸克网盘举例&#xff0c;请看收益明细表。 做网盘拉新&#xff0c;要有高收益&#xff0c;还得靠移动拉新和转存&#xff0c;PC端拉新就2块钱一个人&#xff0c;太少了。 但是&#xff0c;除抖音、小红书这种主打移动端的自媒体平台外。 借助百度和Bing等…

游戏找不到xinput1_3.dll的原因及解决方法

1. xinput1_3.dll 基本信息 1.1 文件名 xinput1_3.dll 是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它属于 Microsoft DirectX for Windows 的一部分。这个文件主要负责处理与 Xbox 360 控制器和其他兼容 XInput 标准的游戏手柄相关的输入信号&#xff0c;确…

这款工具在手,前端开发轻松搞定!

这款工具在手&#xff0c;前端开发轻松搞定&#xff01; 引言 在之前的一篇文章中&#xff0c;已经给大家分享了一款AI助手。尽管该助手能够生成前端代码&#xff0c;但遗憾的是缺少了实时预览的功能。而现在&#xff0c;这一缺憾已经被弥补——你只需要描述你的设计想法&…

土体沉降计在沉降监测中起到什么作用

在土木工程和地质工程领域&#xff0c;对土体的沉降和变形进行精确监测是确保工程安全和质量的关键环节。而土体沉降计作为一种用于测量土体沉降和变形的仪器&#xff0c;在这一过程中发挥了重要的作用。本文将从土体沉降计的工作原理、优点及其在沉降监测中的具体应用等方面进…

基于Spring Boot的旅游网站

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c…

面试中考察栈和队列的经典算法题

&#x1f49d;&#x1f49d;&#x1f49d;如果你对顺序表的概念与理解还存在疑惑&#xff0c;欢迎观看我之前的作品&#x1f449;【栈和列队详解】 上篇文章&#x1f449; 【面试中顺序表常考的十大题目解析】 目录 &#x1f4af;前言 &#x1f4af;栈相关题目 ⭐有效的括号…

WebSocket 2024/9/30

WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传输。 与HTTP协议的区别 实现

深入解析Excel文件格式:.xls与.xlsx的差异与应用指南

在当今的数据处理和办公自动化领域&#xff0c;Microsoft Excel 无疑是一款极为重要的工具。 它不仅广泛应用于日常的数据录入、计算和图表制作&#xff0c;而且也是数据分析、财务建模等专业 领域不可或缺的软件。Excel 的文件格式经历了多个版本的迭代&#xff0c;其中 .xl…

YOLOv11改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制

前言 这篇文章带来一个经典注意力模块的汇总&#xff0c;虽然有些模块已经发布很久了&#xff0c;但后续的注意力模块也都是在此基础之上进行改进的&#xff0c;对于初学者来说还是有必要去学习了解一下&#xff0c;以加深对模块&#xff0c;模型的理解。 文章目录 前言一、为…

uniapp生物识别示例(人脸识别、指纹识别)

准备工作&#xff1a; mainfest.json设置勾选&#xff1a; 勾选完成后打 App自定义调试基座测试包 示例代码&#xff1a; <template><view class"content"><button v-if"supportSoterAuthenticationArray.includes(facial)" click"…

QT使用qss控制样式实现动态换肤

文章目录 设计QSS样式表动态加载QSS文件主函数调用QT提供了一种非常灵活的方式来使用QSS(Qt Style Sheet,类似于 CSS 的样式表),实现界面的动态换肤功能。QSS可以改变Qt应用程序中几乎所有可视组件的外观,包括颜色、字体、边框等。下面介绍一下如何通过QSS实现动态换肤。 设…

大模型时代的企业AI发展趋势浅析

在当前技术飞速进步的时代背景下&#xff0c;生成式人工智能与大型模型正逐渐成为推动产业变革的关键力量。随着人工智能技术的持续成熟与普及&#xff0c;其应用范围已从个人领域拓展至企业层面&#xff0c;广泛渗透至各个行业。那么&#xff0c;这些新兴技术究竟将为产业界带…

手把手教你使用YOLOv11训练自己数据集(含环境搭建 、数据集查找、模型训练)

一、前言 本文内含YOLOv11网络结构图 训练教程 推理教程 数据集获取等有关YOLOv11的内容&#xff01; 官方代码地址&#xff1a;https://github.com/ultralytics/ultralytics/tree/main/ultralytics/cfg/models/11 二、整体网络结构图 三、环境搭建 项目环境如下&#xf…

天融信运维安全审计系统 synRequest 远程命令执行漏洞复现

0x01 产品描述&#xff1a; 天融信运维安全审计系统TopSAG是基于自主知识产权NGTOS安全操作系统平台和多年网络安全防护经验积累研发而成&#xff0c;系统以4A管理理念为基础、安全代理为核心&#xff0c;在运维管理领域持续创新&#xff0c;为客户提供事前预防、事中监控、事后…

一文了解构建工具——Maven与Gradle的区别

目录 一、Maven和Gradle是什么&#xff1f; 构建工具介绍 Maven介绍 Gradle介绍 二、使用时的区别&#xff1a; 1、新建项目 Maven&#xff1a; Gradle&#xff1a; 2、配置项目 Maven&#xff1a; Gradle&#xff1a; 3、构建项目——生成项目的jar包 Gradle&…

Linux之实战命令20:split应用实例(五十四)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…