性能之Hibernate大批量保存数据优化

开心一笑

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

提出问题

真实项目中,批量插入数据性能优化???

唯美图片

解决问题

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();
    //看这里,重要:这里在插入数据时,设置主键Id
    pcsTestcase.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向数据库中插入大量数据时的优化

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容