开心一笑

【跟我妈说这几天特别郁闷,心情糟透了。
我妈说:要不我给你拿钱你出去玩几天啊!
我立马笑颜逐开:“好啊好啊”!
妈:“开心了吧”!
我:“嗯嗯,妈,快点拿钱呀!”
妈:“你都开心了我还拿钱干啥!”
我。。。】

视频教程

大家好,我录制的视频《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大批量保存数据优化相关推荐

  1. 17-1-数据处理思想和程序架构: 单片机stm32的flash保存数据优化方案(让擦写次数达到上百万至上千万次)

    资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git 点击加入群聊[单片机,物联网,上位机]: 说明1:知识从未如此性感. 烂程 ...

  2. hibernate保存mysql乱码_hibernate保存数据到mysql时的中文乱码问题

    因为hibernate底层使用的是jdbc的技术,所以我参考了别人使用jdbc保存数据到mysql里面时解决乱码问题的方法! 首先要告诉数据库要插入的字符串的字符集,mysql 默认使用的字符集是 l ...

  3. SQL优化—— 大批量插入数据

    大批量插入数据 环境准备: 当使用load 命令导入数据的时候,适当的设置可以提高导入的效率

  4. hibernate 无法保存timestamp_为什么很多人不愿意用hibernate了?

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家(已修复) 下一篇:昨天分享资料不小心把百度网盘深处 ...

  5. sql性能分析以及sql语句的优化

    sql性能分析的几种方式 SQL执行频率 show [session|global] status like 'com__(七个下划线)_';可以查看当前数据库的INSERT.UPDATE.DELET ...

  6. hibernate savealiasentity 保存后id为空_好程序员Java教程分享Java面试题之Hibernate

    好程序员Java教程分享Java面试题之Hibernate 1.简书一下Hibernated的开发流程 第一步:加载Hibernate的配置文件,读取配置文件的参数, 第二步:创建SessionFac ...

  7. 性能之巅:定位和优化程序CPU、内存、IO瓶颈

    摘要:性能优化指在不影响系统运行正确性的前提下,使之运行得更快,完成特定功能所需的时间更短,或拥有更强大的服务能力. #一.思维导图 #二.什么是性能优化? 性能优化指在不影响系统运行正确性的前提下, ...

  8. SuperMap GIS BIM类型数据优化 QA

    一.BIM数据特点 BIM数据它不仅可以在设计中应用,还可应用于建设工程项目的整个寿命周期中:用BIM进行设计属于数字化设计:BIM的数据库是动态变化的,在应用过程中不断在更新.丰富和充实:为项目参与 ...

  9. mysql unique_subquery_mysql 数据优化

    在工作中我们经常要与数据库打交道,数据优化已经成为一个无法避免的问题,在这里先不考虑 mysql 服务器优化.连接数.主从同步等问题,只优化数据,以及更好的业务处理. PS:这里我们假设数据是百万级, ...

最新文章

  1. DNS与Active Directory在两台服务器分别布署
  2. OpenStack Rally 质量评估与自动化测试利器
  3. UA MATH564 概率论 公式与定理总结
  4. DNS IP DOMAIN 详解
  5. 一种基于红黑树和timerfd的用户态定时器
  6. ElasticSearch之 控制相关度原理讲解
  7. 使用servlet技术与前端进行交互,出现乱码的解决方案,创建一个类,如下:
  8. 解决django传递URL报错Specifying a namespace in include() without providing an app_name is not supported.
  9. Oracle项目管理系统P6 EPPM企业级规划方案
  10. 1. 无穷维空间的测度论-Wiener测度(二)
  11. 有定位的含有 input的弹框,在有些手机光标乱跳
  12. 如何将epub电子书格式转换成txt文本
  13. android kl文件编辑,Android手机固件的简单修改教程
  14. android仿美团外卖选择地址,Android仿美团地址选择
  15. 笔试 | 东方财富 2020 春季校园招聘后端开发在线笔试【Python】【C++】【字符串】【动态规划】
  16. 微信小程序,成语闯关游戏
  17. 在线加密解密网站大全2022(更新中ing)
  18. 视频按帧截取 python程序
  19. proxifier 代理bluestack
  20. Mysql不能备份序列_无法mysqldump

热门文章

  1. linux run fsck,unexpected inconsistency;RUN fsck MANUALLY 解决方案
  2. 基于svelte3+sass仿微信网页版聊天|svelte.js 桌面聊天实例SvelteWebChat
  3. 修改虚拟机下的网络和ip设置
  4. 【原创】Centos6中yum方法安装sl(linux有趣命令之一sl跑火车)
  5. 清风数学建模学习笔记——灰色预测模型推导及原理详解
  6. 某宝x-sign签名分析-店铺全量商品接口
  7. 基于深度学习的高精度交警检测识别系统(PyTorch+Pyside6+YOLOv5模型)
  8. 6-1 圆的面积 (10 分)
  9. js干货-Bom,Dom事件及各种案例
  10. Fel表达式计算引擎学习 侵删