性能之Hibernate大批量保存数据优化
开心一笑
【跟我妈说这几天特别郁闷,心情糟透了。
我妈说:要不我给你拿钱你出去玩几天啊!
我立马笑颜逐开:“好啊好啊”!
妈:“开心了吧”!
我:“嗯嗯,妈,快点拿钱呀!”
妈:“你都开心了我还拿钱干啥!”
我。。。】
视频教程
大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……
视频地址:http://edu.csdn.net/lecturer/994
提出问题
真实项目中,批量插入数据性能优化???
解决问题
1.业务场景
1.1 业务描述
数据库有一张表(pm_testcase),客户有一份excel数据,里面有3+万条左右案例。现在需要解析excel里面的内容,对每条数据进行校验。比如:名称长度校验,编号校验,用户账号是否存在检验等等。然后封装成 List 集合,批量保存。
CREATE TABLE "public"."pm_testcase" (
"id" varchar(32) COLLATE "default" NOT NULL,
"code" varchar(50) COLLATE "default",
"name" varchar(200) COLLATE "default",
//....省略若干个字段
CONSTRAINT "pk_pm_testcase" PRIMARY KEY ("id")
)
WITH (OIDS=FALSE)
;
1.2 业务流程图
2.项目现状
2.1 问题一
在excel数据导入,循环 List 集合,进行校验时,存在大量的连接数据库操作。
//循环excel的每一行
for (int j = sheet.getFirstRowNum() + 1,len = sheet.getLastRowNum(); j <= len; j++) {Row row = sheet.getRow(j);if (row == null) continue;if (StringUtils.isEmpty(getValue(row.getCell(6)))) resultBuffer.append("案例类型为空,");//....省略其他校验操作...//连接数据库SysUser sysUser = sysUserService.findById(id);
}
2.2 问题二
直接批量保存3万多条数据。
List<PcsTestcase> pcsTestcases = new ArrayList<>();
// ......
//直接调用批量保存
this.batchCreate(pcsTestcases);
2.3 问题三
批量保存时,利用UUID生成工具,给主键设置Id。找出Hibernate的先查询后更新的机制触发,造成不必要的查询损耗。
List<PcsTestcase> pcsTestcases = new ArrayList<>();
PcsTestcase pcsTestcase = null;
for (int j = sheet.getFirstRowNum() + 1,len = sheet.getLastRowNum(); j <= len;j++) {Row row = sheet.getRow(j);if (row == null) continue;pcsTestcase = new PcsTestcase();//看这里,重要:这里在插入数据时,设置主键IdpcsTestcase.setId(UUIDUtils.generate());pcsTestcase.setPmMilestoneId(pcsMainTask.getId());
}
3. 解决方法
3.1 问题一解决方法
对于问题一,除了避免在 for 循环体内连接数据库外,我们可以利用 Map集合的缓存机制,把之后需要用到的数据加载到map集合中。比如:依次性查询出所有的用户数据等等,存放在Map集合中。
3.2 问题二解决方法
对于问题二,我们可以把所有数据,每500条进行一次批量保存操作,速度会比一次性批量保存好。具体如下:
if(j % 500 == 0 || j == len){this.batchCreate(pcsTestcases);pcsTestcases = new ArrayList<>();
}
3.3 问题三解决方法
对于问题三,由于Hibernate在进行插入时,会判断数据是进行插入还是进行更新。如果模型的主键不为空,查询数据后,再进行更新数据,否则,进行插入数据操作。因此,我们在进行插入操作时候,不要设置模型的主键,可以避免不必要查询消耗。
pcsTestcase.setId(UUIDUtils.generate());
基本的优化思路就是这样了,大功告成~~~
读书感悟
来自北宋名相寇准《六悔铭》,教人要及早觉悟悔改
- 六悔铭
官行私曲,失时悔。
富不俭用,贫时悔。
艺不少学,过时悔。
见事不学,用时悔。
醉发狂言,醒时悔。
安不将息,病时悔。
经典故事
【一教授与农民在火车上相对而坐,无聊之际。教授说:我出一道题,你若不知,给我5元,如果你出一道题,我若不知,给你500元如何?农民同意。教授问:月亮距地球多远?农民一言不发递给教授5元。农民问:上山三条腿,下山四条腿,是什么动物?教授苦思无解,无奈给农民500元。农民接过钱准备睡觉。教授追问:上山三条腿,下山四条腿究竟是什么动物?农民一言不发递给教授5元钱,然后睡觉了。低学历高智商,太可怕了!这就是许多没学历的人能成为老板,首富的原因。】
大神文章
【1】【Java/JDBC.ORM】 jdbc插入大量数据时优化处理
【2】Hibernate批处理操作优化 (批量插入、更新与删除)
【3】用Java向数据库中插入大量数据时的优化
其他
如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!
性能之Hibernate大批量保存数据优化相关推荐
- 17-1-数据处理思想和程序架构: 单片机stm32的flash保存数据优化方案(让擦写次数达到上百万至上千万次)
资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git 点击加入群聊[单片机,物联网,上位机]: 说明1:知识从未如此性感. 烂程 ...
- hibernate保存mysql乱码_hibernate保存数据到mysql时的中文乱码问题
因为hibernate底层使用的是jdbc的技术,所以我参考了别人使用jdbc保存数据到mysql里面时解决乱码问题的方法! 首先要告诉数据库要插入的字符串的字符集,mysql 默认使用的字符集是 l ...
- SQL优化—— 大批量插入数据
大批量插入数据 环境准备: 当使用load 命令导入数据的时候,适当的设置可以提高导入的效率
- hibernate 无法保存timestamp_为什么很多人不愿意用hibernate了?
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家(已修复) 下一篇:昨天分享资料不小心把百度网盘深处 ...
- sql性能分析以及sql语句的优化
sql性能分析的几种方式 SQL执行频率 show [session|global] status like 'com__(七个下划线)_';可以查看当前数据库的INSERT.UPDATE.DELET ...
- hibernate savealiasentity 保存后id为空_好程序员Java教程分享Java面试题之Hibernate
好程序员Java教程分享Java面试题之Hibernate 1.简书一下Hibernated的开发流程 第一步:加载Hibernate的配置文件,读取配置文件的参数, 第二步:创建SessionFac ...
- 性能之巅:定位和优化程序CPU、内存、IO瓶颈
摘要:性能优化指在不影响系统运行正确性的前提下,使之运行得更快,完成特定功能所需的时间更短,或拥有更强大的服务能力. #一.思维导图 #二.什么是性能优化? 性能优化指在不影响系统运行正确性的前提下, ...
- SuperMap GIS BIM类型数据优化 QA
一.BIM数据特点 BIM数据它不仅可以在设计中应用,还可应用于建设工程项目的整个寿命周期中:用BIM进行设计属于数字化设计:BIM的数据库是动态变化的,在应用过程中不断在更新.丰富和充实:为项目参与 ...
- mysql unique_subquery_mysql 数据优化
在工作中我们经常要与数据库打交道,数据优化已经成为一个无法避免的问题,在这里先不考虑 mysql 服务器优化.连接数.主从同步等问题,只优化数据,以及更好的业务处理. PS:这里我们假设数据是百万级, ...
最新文章
- DNS与Active Directory在两台服务器分别布署
- OpenStack Rally 质量评估与自动化测试利器
- UA MATH564 概率论 公式与定理总结
- DNS IP DOMAIN 详解
- 一种基于红黑树和timerfd的用户态定时器
- ElasticSearch之 控制相关度原理讲解
- 使用servlet技术与前端进行交互,出现乱码的解决方案,创建一个类,如下:
- 解决django传递URL报错Specifying a namespace in include() without providing an app_name is not supported.
- Oracle项目管理系统P6 EPPM企业级规划方案
- 1. 无穷维空间的测度论-Wiener测度(二)
- 有定位的含有 input的弹框,在有些手机光标乱跳
- 如何将epub电子书格式转换成txt文本
- android kl文件编辑,Android手机固件的简单修改教程
- android仿美团外卖选择地址,Android仿美团地址选择
- 笔试 | 东方财富 2020 春季校园招聘后端开发在线笔试【Python】【C++】【字符串】【动态规划】
- 微信小程序,成语闯关游戏
- 在线加密解密网站大全2022(更新中ing)
- 视频按帧截取 python程序
- proxifier 代理bluestack
- Mysql不能备份序列_无法mysqldump
热门文章
- linux run fsck,unexpected inconsistency;RUN fsck MANUALLY 解决方案
- 基于svelte3+sass仿微信网页版聊天|svelte.js 桌面聊天实例SvelteWebChat
- 修改虚拟机下的网络和ip设置
- 【原创】Centos6中yum方法安装sl(linux有趣命令之一sl跑火车)
- 清风数学建模学习笔记——灰色预测模型推导及原理详解
- 某宝x-sign签名分析-店铺全量商品接口
- 基于深度学习的高精度交警检测识别系统(PyTorch+Pyside6+YOLOv5模型)
- 6-1 圆的面积 (10 分)
- js干货-Bom,Dom事件及各种案例
- Fel表达式计算引擎学习 侵删