mybatis批量插入10万条数据的优化过程

在使用mybatis插入大量数据的时候,为了提高效率,放弃循环插入,改为批量插入,mapper如下:

package com.lcy.service.mapper;import com.lcy.service.pojo.TestVO;
import org.apache.ibatis.annotations.Insert;import java.util.List;/*** 功能描述:** @author liuchaoyong* @version 1.0* @date 2019-06-26 13:18*/
public interface TestMapper {@Insert("<script>" +"insert into test (t1,t2,t3,t4,t5) values " +"<foreach collection='list' item='obj' separator=','>" +"(#{obj.t1},#{obj.t2},#{obj.t3},#{obj.t4},#{obj.t5})" +"</foreach>" +"</script>")Integer testBatchInsert(List<TestVO> list);}

实体类:

package com.lcy.service.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 功能描述:** @author liuchaoyong* @version 1.0* @date 2019-06-26 13:20*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestVO {private String t1;private String t2;private String t3;private String t4;private String t5;}

测试类如下:

import com.lcy.service.TestApplication;
import com.lcy.service.mapper.TestMapper;
import com.lcy.service.pojo.TestVO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.ArrayList;
import java.util.List;/*** 功能描述:** @author liuchaoyong* @version 1.0* @date 2019-05-17 16:42*/
@SpringBootTest(classes = TestApplication.class)
@RunWith(SpringRunner.class)
public class TestDemo {@Autowiredprivate TestMapper testMapper;@Testpublic void insert() {List<TestVO> list = new ArrayList<>();for (int i = 0; i < 200000; i++) {list.add(new TestVO(i + "," + i, i + "," + i, i + "," + i, i + "," + i, i + "," + i));}System.out.println(testMapper.testBatchInsert(list));}}

为了复现bug,我限制了JVM内存:

在这里插入图片描述
执行测试类报错如下:

java.lang.OutOfMemoryError: Java heap spaceat java.base/java.util.Arrays.copyOf(Arrays.java:3746)

可以看到,Arrays在申请内存的时候,导致栈内存溢出

改进方法,分批新增:

import com.lcy.service.TestApplication;
import com.lcy.service.mapper.TestMapper;
import com.lcy.service.pojo.TestVO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;/*** 功能描述:** @author liuchaoyong* @version 1.0* @date 2019-05-17 16:42*/
@SpringBootTest(classes = TestApplication.class)
@RunWith(SpringRunner.class)
public class TestDemo {@Autowiredprivate TestMapper testMapper;@Testpublic void insert() {List<TestVO> list = new ArrayList<>();for (int i = 0; i < 200000; i++) {list.add(new TestVO(i + "," + i, i + "," + i, i + "," + i, i + "," + i, i + "," + i));}int index = list.size() / 10000;for (int i=0;i< index;i++){//stream流表达式,skip表示跳过前i*10000条记录,limit表示读取当前流的前10000条记录testMapper.testBatchInsert(list.stream().skip(i*10000).limit(10000).collect(Collectors.toList()));}}}

有一种方法是调高JVM内存,不过不建议使用,不仅吃内存,而且数据量过大会导致sql过长报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java spring注解维护,从一次工程启动失败谈谈 spring 注解

原标题&#xff1a;从一次工程启动失败谈谈 spring 注解檀宝权Java 后端开发工程师&#xff0c;负责度假 App 后端和广告后端开发维护工作&#xff0c;熟悉 Tomcat&#xff0c;Spring&#xff0c;Mybatis&#xff0c;会点 Python&#xff0c;Lua。一、背景线上环境升级成 JDK8后…

探索Java日志的奥秘:底层日志系统-log4j2

前言 log4j2是apache在log4j的基础上&#xff0c;参考logback架构实现的一套新的日志系统&#xff08;我感觉是apache害怕logback了&#xff09;。 log4j2的官方文档上写着一些它的优点&#xff1a; 在拥有全部logback特性的情况下&#xff0c;还修复了一些隐藏问题API 分离&…

大地震!某大厂“硬核”抢人,放话:只要AI人才,高中毕业都行!

特斯拉创始人马斯克&#xff0c;在2019年曾许下很多承诺&#xff0c;其中一个就是&#xff1a;2019年底实现完全的自动驾驶。虽然这个承诺又成了flag&#xff0c;但是不妨碍他今年继续为这个承诺努力。这不&#xff0c;就在上周一&#xff0c;马斯克之间在twitter上放话了&…

Dart编译技术在服务端的探索和应用

前言 最近闲鱼技术团队在FlutterDart的多端一体化的基础上&#xff0c;实现了FaaS研发模式。Dart吸取了其它高级语言设计的精华&#xff0c;例如Smalltalk的Image技术、JVM的HotSpot和Dart编译技术又师出同门。由Dart实现的语言容器&#xff0c;它可以在启动速度、运行性能有不…

Python + ElasticSearch:有了这个超级武器,你也可以报名参加诗词大会了! | 博文精选...

来源 | CSDN 博客作者 | 天元浪子责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;意犹未尽的诗词大会正月十六&#xff0c;中国诗词大会第五季落下帷幕。从2016年2月12日第一季于开播&#xff0c;迄今恰好四周年。在这个舞台上&#xff0c;时年…

Node.js 应用故障排查手册 —— 大纲与常规问题指标简介

楔子 你是否想要尝试进行 Node.js 应用开发但是又总听人说它不安全、稳定性差&#xff0c;想在公司推广扩张大前端的能力范畴和影响又说服不了技术领导。 JavaScript 发展到今天&#xff0c;早已脱离原本浏览器的战场&#xff0c;借助于 Node.js 的诞生将其触角伸到了服务端、P…

蚂蚁金服CTO程立:做工程要有“拧螺丝”的精神

“一台机器可能有无数颗螺丝&#xff0c;需要一个一个地拧&#xff0c;而且需要一圈一圈地拧&#xff0c;才能让系统间严丝合缝&#xff0c;顺利工作。代码的世界里&#xff0c;一个项目到底成功与否&#xff0c;也是取决于几个模型的关键特殊设置&#xff0c;就像拧螺丝一样。…

linux 环境安装DBI和DBD_03

文章目录一、软件下载二、安装DBI2.1. DBI下载2.2. 解压2.3. 安装依赖2.4. 编译2.5. 执行测试2.6. 安装2.6. 修改权限三、安装DBD-ORACLE组件3.1. DBI下载3.2. 修改权限3.3. 切换用户3.4. 解压3.5. 进入目录3.6. 初始化环境变量3.6. 查看配置的环境变量是否配置3.7. 刷新配置文…

像数据科学家一样思考:12步指南(上)

介绍 目前&#xff0c;数据科学家正在受到很多关注&#xff0c;因此&#xff0c;有关数据科学的书籍正在激增。我看过很多关于数据科学的书籍&#xff0c;在我看来他们中的大多数更关注工具和技术&#xff0c;而不是数据科学中细微问题的解决。直到我遇到Brian Godsey的“像数…

Mybatis-plus 大数据量数据流式查询通用接口

文章目录一、案例需求二、使用案例&#xff1a;2.1. 自定义查询接口2.2. 逻辑处理类2.3. 调用案例2.4. 具体逻辑处理案例三、企业案例3.1. key名称获取3.2. 逻辑类测试3.3.最后一个批次处理方案四、 通用SQL预编译处理4.1. 业务场景4.2. xml形式4.3. 注解形式五、企业案例5.1. …

基于MaxCompute的数仓数据质量管理

声明 本文中介绍的非功能性规范均为建议性规范&#xff0c;产品功能无强制&#xff0c;仅供指导。 参考文献 《大数据之路——阿里巴巴大数据实践》——阿里巴巴数据技术及产品部 著。 背景及目的 数据对一个企业来说已经是一项重要的资产&#xff0c;既然是资产&#xff…

IP应用加速 – DCDN迈入全栈新篇章

4月11日&#xff0c;第七届"亚太内容分发大会"暨CDN峰会国际论坛中&#xff0c;阿里云资深技术专家姚伟斌发布了DCDN子产品IP应用加速&#xff08;IPA&#xff09;。IPA是基于阿里云CDN本身的资源优化&#xff0c;对传输层&#xff08;TCP&UDP&#xff09;协议进…

十年磨一剑,王坚自研的MaxCompute如何解决世界级算力难题

大数据时代&#xff0c;随着企业数据规模的急剧增长&#xff0c;传统软件已无法承载&#xff0c;这也推动了大数据技术的发展&#xff0c;Google、AWS、微软等硅谷巨头纷纷投入大数据技术的研发&#xff1b;而在国内&#xff0c;王坚也在十年前带领阿里云团队研发MaxCompute&am…

matlab和robotstudio,MATLAB与Robotstudio建立socket通信(初探)

前记:听一首《不想病》&#xff0c;歌词唱开头&#xff1a;做什么都不对&#xff0c;说什么都浪费&#xff0c;想什么我都可悲....&#xff1b;感觉就是不一样&#xff0c;好歌&#xff01;哎&#xff0c;&#xff0c;&#xff0c;回到正题。好多事要去做&#xff0c;还得挤时间…

贾扬清:我对人工智能方向的一点浅见

阿里妹导读&#xff1a;作为 AI 大神&#xff0c;贾扬清让人印象深刻的可能是他写的AI框架Caffe &#xff0c;那已经是六年前的事了。经过多年的沉淀&#xff0c;成为“阿里新人”的他&#xff0c;对人工智能又有何看法&#xff1f;最近&#xff0c;贾扬清在阿里内部分享了他的…

Node.js 应用故障排查手册 —— 类死循环导致进程阻塞

类死循环导致进程阻塞 楔子 在实践篇一中我们看到了两个表象都是和 CPU 相关的生产问题&#xff0c;它们基本也是我们在线上可能遇到的这一类问题的典型案例&#xff0c;而实际上这两个案例也存在一个共同点&#xff1a;我们可以通过 Node.js 性能平台 导出进程对应的 CPU Pro…

如何使用5个Python库管理大数据?

来源 | medium编译 | 武明利责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;如今&#xff0c;Python真是无处不在。尽管许多看门人争辩说&#xff0c;如果他们不使用比Python更难的语言编写代码&#xff0c;那么一个人是否真是软件开发人员&…

如何把创建ECS(CreateInstance)作为触发器来触发函数计算

问题描述 函数计算虽然不支持直接集成到ECS的管控事件上&#xff0c;但是函数计算本身是支持日志服务作为触发器的。即可以配置日志服务中logstore里的增强日志作为触发器来触发函数计算服务中的函数&#xff0c;同时可以传递project 和 logstore的name以及beginCursor/endCur…

ORACLE添加字段、删除字段

文章目录1. 删除表2. 创建表3. 添加字段4. 删除指定字段5. 修改指定字段长度1. 删除表 DROP TABLE SYS_JOB;2. 创建表 -- CREATE TABLE CREATE TABLE SYS_JOB (JOB_ID NUMBER(30) NOT NULL,JOB_NAME VARCHAR2(30) NOT NULL ); ALTER TABLE SYS_JOB ADD CONSTRA…

像数据科学家一样思考:12步指南(中)

像数据科学家一样思考&#xff1a;12步指南&#xff08;上&#xff09;《像数据科学家一样思考》 7-工程产品 下一步是建立统计软件。如果统计是分析和从数据中得出结论的框架&#xff0c;那么软件就是将这个框架付诸行动的工具。数据科学家必须为任何项目做出许多软件选择。如…