使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解
SQLite数据库作为一般单机版软件的数据库,是非常优秀的,我目前单机版的软件产品线基本上全部替换Access作为优选的数据库了,在开发过程中,有时候需要批量写入数据的情况,发现传统的插入数据模式非常慢,几千条数据的写入或者更新可能需要好几分钟时间,而SqlServer则相同的操作可能几秒即可,有无更好的方法来提高它的响应速度呢?答案是有的,就是采用事务提交,默认SQLite的数据库插入操作,如果没有采用事务的话,它每次写入提交,就会触发一次事务操作,而这样几千条的数据,就会触发几千个事务的操作,这就是时间耗费的根源。本文通过详细代码介绍如何使用事务来提高整个批量插入数据的速度,并以实际的Winform开发框架中的字典管理模块的批量插入功能来进行介绍,通过前后速度的对比,使得事务操作提高响应速度更有说服力。
为了提高响应速度,我这里使用了事务操作,整个事务操作是基于EnterpriseLibray类库的数据库操作,由于我已经在框架的基类中做了封装,因此我们这里看到整个处理过程即可。
其中MyRegion里面的代码就是遍历每行的数据,构造数据字典对象和排序号,然后调用InsertDictData函数进行数据的录入。其中InsertDictData函数的代码是
/// <summary>/// 使用事务参数,插入数据,最后统一提交事务处理/// </summary>/// <param name="dictData">字典数据</param>/// <param name="seq">排序</param>/// <param name="trans">事务对象</param>private void InsertDictData(string dictData, string seq, DbTransaction trans){if (!string.IsNullOrWhiteSpace(dictData)){DictDataInfo info = new DictDataInfo();info.Editor = LoginID;info.LastUpdated = DateTime.Now;info.DictType_ID = this.txtDictType.Tag.ToString();info.Name = dictData.Trim();info.Value = dictData.Trim();info.Remark = this.txtNote.Text.Trim();info.Seq = seq;bool succeed = BLLFactory<DictData>.Instance.Insert(info, trans);}}
整个插入功能按钮的处理全部代码如下所示。
private void btnOK_Click(object sender, EventArgs e){string[] arrayItems = this.txtDictData.Lines;int intSeq = -1;int seqLength = 3;string strSeq = this.txtSeq.Text.Trim();if (int.TryParse(strSeq, out intSeq)){seqLength = strSeq.Length;}if (arrayItems != null && arrayItems.Length > 0){DbTransaction trans = BLLFactory<DictData>.Instance.CreateTransaction();if (trans != null){try{#region MyRegionforeach (string strItem in arrayItems){if (this.radSplit.Checked){if (!string.IsNullOrWhiteSpace(strItem)){string[] dataItems = strItem.Split(new char[] { ',', ',', ';', ';', '/', '、' });foreach (string dictData in dataItems){#region 保存数据string seq = "";if (intSeq > 0){seq = (intSeq++).ToString().PadLeft(seqLength, '0');}else{seq = string.Format("{0}{1}", strSeq, intSeq++);}InsertDictData(dictData, seq, trans);#endregion}}}else{#region 保存数据if (!string.IsNullOrWhiteSpace(strItem)){string seq = "";if (intSeq > 0){seq = (intSeq++).ToString().PadLeft(seqLength, '0');}else{seq = string.Format("{0}{1}", strSeq, intSeq++);}InsertDictData(strItem, seq, trans);}#endregion}}#endregiontrans.Commit();ProcessDataSaved(this.btnOK, new EventArgs());MessageDxUtil.ShowTips("保存成功");this.DialogResult = DialogResult.OK;}catch (Exception ex){trans.Rollback();LogTextHelper.Error(ex);MessageDxUtil.ShowError(ex.Message);}}}}
上面的批量插入,经过前后的测试,2千条数据批量插入SQLite数据库,需要大概3~4分钟左右,如果采用了事务操作,则在1~2秒内写入完成,速度提高不知道多少倍。如果是操作数据比较多的,强烈建议使用事务进行操作,可以给客户很好的体验效果。
如果嫌上面的代码复杂,可以看下面的讲解代码可能就明白了
using (DbTransaction dbTrans = conn.BeginTransaction()){using (DbCommand cmd = conn.CreateCommand()){cmd.CommandText = "INSERT INTO MyTable(MyValue) VALUES(?)";DbParameter Field1 = cmd.CreateParameter();cmd.Parameters.Add(Field1);for (int n = 0; n < 100000; n++){Field1.Value = n + 100000;cmd.ExecuteNonQuery();}}}
上面是一种比较简单原始的事务操作,如果批量插入数据,同样能够起到一样的效果。
使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解相关推荐
- 后台接收数组_微信小程序如何与后台api接口进行数据交互(微信报修小程序源码讲解七)...
完成用户授权登录逻辑后,接下来的开发工作大部分都是与后台 api 接口的交互,本节我们详细讲解一下小程序如何与 api 进行交互 . 小程序如何发送 http/https 请求到后台? 小程序请求 h ...
- MySQL批量插入大量数据方法
在MySQL数据库中,如果要插入上百万级的记录,用普通的 insert into 来操作非常不现实,速度慢人力成本高,推荐使用 Load Data 或存储过程来导入数据,我总结了一些方法分享如下,主要 ...
- 批量插入以及数据存在重复就进行更新操作
批量插入以及数据存在重复就进行更新操作 示例: /*** 批量更新** @param guiYangStationInfos*/ private void updateStationInfos(Str ...
- MySQL 批量插入/填充数据 - 实践
1.应用场景 应用场景之一: 有时,我们需要创建表并填充大量测试数据. 2.学习/操作 1.文档 TBD 2. 整理输出 环境 Windows 10 64位 专业版 i7 32G 机械硬盘 474 ...
- c 批量导入mysql数据库_C#.NET中如何批量插入大量数据到数据库中
在WEB项目开发过程中有时会碰到批量插入数据到数或者是将EXCEL文件据入到数据库中.为了方便实现可以先将EXCEL导入到GRIDVIEW中然后一次批量插入.实现代码如下: 前台代码 后台代码: // ...
- 批量插入模拟数据入库
批量插入模拟数据入库 <?php $dbh = new PDO('mysql:host=127.0.0.1;dbname=yu', 'root', 'root');$starTime = mic ...
- Mysql脚本循环批量插入数组数据
Mysql脚本循环批量插入数组数据 涉及到Mysql知识点 脚本研究背景 Mysql完整脚本 ·首次写博客,不知道说点啥,直接上点干货,希望大家指出不足之处,共同进步. 涉及到Mysql知识点 存储过 ...
- MySQL创建函数和存储过程,批量插入大数据
工作中使用Jmeter压测时,需要大数据量,可以使用MySQL创建函数和存储过程,批量插入大数据 右击新建函数,创建过程 完成后自动创建 在body部分写入过程: DECLARE id INT DEF ...
- mybatis批量插入(insert)和批量更新(update)
文章目录 一.Mybatis批量插入 二.批量更新 前言:这两天在做mybatis批量插入和更新的时候,对这块不是很清楚,所以今天写篇文章,巩固加深印象. 一.Mybatis批量插入 批量插入的sql ...
- batchupdate写法_mybatis执行批量插入insert和批量更新update
Mybatis批量插入和批量更新数据的资料相信大家从网上能查找到很多资料,本文重点总结一下mybatis执行批量插入insert和批量更新update数据.在mysql数据库中批量插入,如:inser ...
最新文章
- 互联网造车如火如荼,我们错怪贾跃亭了? | 圆桌脱口秀
- 【Paper】2016_Cooperative UAV-UGV modeled by Petri Net Plans specification
- LintCode: Single Number II
- 漫谈计算摄像学 (二):利用光场实现“先拍照后对焦”
- 张勇谈组织架构调整:领导者要善于“从后排把人往前拔”
- 密码机 密钥管理项目安装配置 从零开始
- python练习笔记——利用信号signal处理僵尸进程
- 12月14日习题答案大剖析!html5基础测试来啦
- java的有意思的_发现一个有意思的项目banana
- 通过代码下载全国范围详细区县行政区Shp数据
- LPDDR4协议规范之 (六)刷新
- 二维数组/三维数组 定义
- 操作系统中的进程调度策略有哪几种
- java mqtt 订阅主题_Mqtt 客户端多主题订阅
- 云原生落地实践的25个步骤
- 11_传智播客iOS视频教程_NS前缀和@符号
- 什么是数据分层,数据分层的作用!
- db2 删除索引_[收录量]史上最全的百度索引量下降原因分析及解
- dz程序上传服务器的位置,dz手机端上传到远程服务器
- 哈尔滨工业大学 计算机系教授,哈尔滨工业大学计算机科学与技术学院导师简介:张田文...