Qt多线程操作sqlite数据库

问题

就是为了多线程操作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.mfbz.cn/a/885158.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图解C#高级教程(一):委托

什么是委托 可以认为委托是持有一个或多个方法的对象。但它与对象不同&#xff0c;因为委托可以被执行。当执行委托时&#xff0c;委托会执行它所“持有”的方法。先看一个完整的使用示例。 // See https://aka.ms/new-console-template for more informationdelegate void M…

【Git原理与使用】Git初识基本操作

Git初识&&基本操作 1.初识Git2.Git安装3.Git基本操作3.1创建Git本地仓库3.2配置Git3.3认识工作区、暂存区、版本库3.4添加文件3.5修改文件3.6版本回退3.7撤销修改3.8删除文件 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f…

Vscode超好看的渐变主题插件

样式效果&#xff1a; 插件使用方法&#xff1a; 然后重启&#xff0c;之后会显示vccode损坏&#xff0c;不用理会&#xff0c;因为这个插件是更改了应用内部代码&#xff0c;直接不再显示即可。

基于nodejs+vue的游戏陪玩系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

银河麒麟服务器:更新软件源

银河麒麟服务器&#xff1a;更新软件源 1、使用场景2、操作步骤3、注意事项 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 1、使用场景 当需要安装最新软件或修改软件源配置后&#xff0c;需更新软件源以获取最新软件包信息。 2、操作步…

京东PMO段敬受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 京东集团技术委员会PMO组研发项目经理段敬女士受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“项目经理如何组织高效的项目会议”。大会将于10月26-27日在北京举办&#xff0c;…

亚信安全天穹5分钟勒索体检 免费试用今起上线

对于勒索攻击的认知 你是否还停留在“2.0时代”&#xff1f; 勒索攻击无疑是企业面临的最大威胁&#xff0c;2024年上半年&#xff0c;勒索组织数量同步增长超过50%&#xff0c;勒索攻击数量也持续攀升&#xff0c;平均勒索赎金突破520万美元。 当前&#xff0c;勒索攻击治理…

java学习-idea编辑器基础使用设置

首先打开电脑中的idea编辑器&#xff0c;点击头部&#xff1a;File按钮 → Settings… 打开设置界面&#xff1b; 设置idea的主题 设置idea代码注释的字体颜色 设置idea编辑器的字体和字体大小 设置idea通过提示回车自动导入包 设置idea输入忽略大小写进行提示

【Hadoop】【vim编辑器】【~/.bashrc 文件】如何编辑

1. 进入 vim 编辑器 在终端中输入以下命令&#xff1a; vim ~/.bashrc 2. 进入插入模式 打开文件后&#xff0c;你将处于普通模式。在普通模式下&#xff0c;你不能直接编辑文本。 要进入插入模式&#xff0c;请按下 i 键。这时&#xff0c;你应该会看到屏幕底部出现 -- 插…

fish-speech语音大模型本地部署

文章目录 fish-speech模型下载编译部署 小结 fish-speech模型 先说下fish-speech模型吧&#xff0c;可以先看下官网。如下&#xff1a; 这就是一个模型&#xff0c;可以根据一个样例声音&#xff0c;构建出自己需要的声音。其实&#xff0c;这个还是有很多用途的&#xff1b;…

多模态人像编辑:PortraitGen将2D肖像视频提升到4D 高斯场

这篇文章《Portrait Video Editing Empowered by Multimodal Generative Priors》&#xff0c;作者是来自中国科学技术大学。文章介绍了一种名为PortraitGen的肖像视频编辑方法&#xff0c;它使用多模态生成先验来实现一致性和富有表现力的风格化编辑。 文章地址&#xff1a;P…

匿名管道 Linux

管道 首先自己要用用户层缓冲区&#xff0c;还得把用户层缓冲区拷贝到管道里&#xff0c;&#xff08;从键盘里输入数据到用户层缓冲区里面&#xff09;&#xff0c;然后用户层缓冲区通过系统调用&#xff08;write&#xff09;写到管道里&#xff0c;然后再通过read系统调用&…

[Docker学习笔记]利用Dockerfile创建镜像

Dockerfile 指令 指令作用from继承基础镜像maintainer镜像制作者信息(可缺省)run用来执行shell命令expose暴露端口号cmd启动容器默认执行的命令entrypoint启动容器真正执行的命令volume创建挂载点env配置环境变量add复制文件到容器copy复制文件到容器workdir设置容器的工作目录…

APISIX 联动雷池 WAF 实现 Web 安全防护

Apache APISIX 是一个动态、实时、高性能的云原生 API 网关&#xff0c;提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。 雷池是由长亭科技开发的 WAF 系统&#xff0c;提供对 HTTP 请求的安全请求&#xff0c;提供完整的 API 管理和…

VUE 整合 ECharts

一、vue 引入 ECharts依赖 npm install echarts --save 二、创建盒子 <div ref"chars" style"height: 500px;width:800px;"></div> 解释说明 ref"chars" 是 Vue.js 中一个非常有用的特性&#xff0c;用于给 DOM 元素或组件实例…

二值图像的面积求取的两种方法及MATLAB实现

一、引言 面积在数字图像处理中经常用到&#xff0c;在MATLAB中&#xff0c;计算二值图像的面积通常可以通过两种主要方法实现&#xff1a;遍历法和直接利用bwarea函数。下面将分别介绍这两种方法的原理和相应的MATLAB代码示例。 二、遍历法计算二值图像面积的原理和MATLAB代码…

一条sql在MySQL中是怎么执行的

目录 一、MySQL总体架构二、各层的作用1、连接层2、应用层3、存储引擎层 一、MySQL总体架构 作为常问八股文&#xff0c;相信不少小伙伴当年都被问到过这个问题&#xff0c;回答这个问题我们首先得知道MySQL服务器基本架构&#xff0c;主要分为连接层&#xff0c;应用层和存储…

YOLOv7改进:Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU

💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…

微软 Win11 RP 226x1.4247(KB5043145)预览版发布!

系统之家于9月25日发出最新报道&#xff0c;微软面向Release Preview频道的用户发布了Win11的KB5043145更新。系统更新后版本号提升为22621.4247和22631.4247。此次更新新增多项功能&#xff0c;例如用户播放媒体时&#xff0c;媒体控件会显示在锁屏中央的下部。以下跟随小编看…

easyExcel使用模版填充excel,合并单元格

一、最终效果 二、制作模版 1、制作填充模版 模版在代码中保存的位置 2、Controller /*** 下载模板*/ RequestMapping(value "exportData") public void exportData(KqKqb kqKqb,HttpServletResponse response, HttpServletRequest request) throws IOExceptio…