遇到一个需求是excel数据导入,一次大概会批量插入几万的数据。写完一测奇慢无比。

于是开始打日志,分析代码,发现是插入数据库的时候耗时很长,发现是spring data jpa的原因。

翻看jpa的源码

@Transactional
public <S extends T> List<S> saveAll(Iterable<S> entities) { Assert.notNull(entities, "The given Iterable of entities not be null!"); List<S> result = new ArrayList<S>(); for (S entity : entities) {
result.add(save(entity));
} return result;
}

这里会循环对每个对象进行save操作,看到这里问题也大概清楚了,多次insert操作。

再看看save操作

     @Transactional
public <S extends T> S save(S entity) { if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}

保存的时候,会对对象做存在性检查,就是先查一边,要是不存在才会保存。

优化方案有很多种,但是要从根本上解决这个问题,就要避免jpa 的多次保存和存在性检查,才能减少数据库的交互。

最后选用的是spring data jpa和spring jdbc组合使用,jpa大量的写入就用sprng jdbc。

另外,在数据库地址上加上

rewriteBatchedStatements=true 开启批量写入

因为spring jdbc 和spring boot 的兼容性很好,基本不需要什么配置,另外spring jdbc 的namedParameterJdbcTemplate.batchUpdate对批量插入编写sql也比较快捷。

优化之后比之前减少90%的时间,看来jpa是真不适合数据量稍大的系统,需要和其他框架配合使用才行。

JPA批量插入优化的更多相关文章

  1. 【MySQL】insert批量插入优化方案

    对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...

  2. MSSQL数据批量插入优化详细

    序言 现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢? 或者你的批量数据是如何插入的呢?我今天就此问题做个探 ...

  3. JDBC批量插入优化addbatch

    // 获取要设置的Arp基准的List后,插入Arp基准表中 public boolean insertArpStandardList(List<ArpTable> list) { Con ...

  4. oracle批量插入优化方案

    今天听DBA说如果从一个表批量查询出一批数据之后批量插入另外一张表的优化方案: 1)不写归档日志: 2)采用独占 关于insert /*+ append */我们需要注意以下三点: a.非归档模式下, ...

  5. jpa 批量插入

    @Override @Transactional public <S extends E> List<S> save(Iterable<S> entities) { ...

  6. Qt SQLite 批量插入优化(SQLite默认将每条语句看成单独的事务)good

    使用SQLite存储数据时发现插入速度太慢,程序跑了将近五分钟才插入了不到三千条.上网查资料才发现,SQLite这种文件数据库与MySql机制不一样,每条事务都有打开和关闭文件的步骤,SQLite默认 ...

  7. SQLite批量插入优化方法

    SQLite的数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度.   例如:向数据库中插入10 ...

  8. mysql 批量插入优化之rewriteBatchedStatements

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt397 介绍MySQL Jdbc驱动的rewriteBatchedStatem ...

  9. Hbase批量插入优化记录

    2016年5月11日10:08:29 hbase原本的put方式是一条一条的put,在客户端修改 AutoFlush 将HTable的setAutoFlush设为false,可以支持客户端批量更新.即 ...

随机推荐

  1. CodeForces 309B Context Advertising

    洛谷题目页面传送门 & CodeForces题目页面传送门 给定一个\(n\)个单词的文本,第\(i\)个单词的长度为\(len_i\),要求截取文本的一段(单词必须取整的),分若干行放,同行 ...

  2. Linux环境下:vmware安装Windows报错误-无人参与应答文件包含的产品密钥无效

    最近在安装window server 2012 R2的时候,输入好密钥可以继续安装,但在后面又提示我“无人参与应答文件包含的产品密钥无效.删除无效的密钥或在无人参与应答文件中提供有效的产品密钥继续进行 ...

  3. Java自学-类和对象 包

    Java中的 包 包: package 把比较接近的类,规划在同一个包下 步骤 1 : 把比较接近的类,规划在同一个包下 Hero,ADHero 规划在一个包,叫做charactor(角色) Item ...

  4. Java 之 自定义异常

    1.为什么需要自定义异常类 Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是没有定义好的,此时我们根据自己业务的异常情况来定义异常类.  一些异常都是 Java ...

  5. linux配置iptables

    iptables主要用来配置防火墙.其是一个需要特别谨慎设置的东西,服务器不在身边,不要贸然设置,有可能导致无法SSH,那就麻烦了. 1.首先介绍一下指令和相关配置文件 启动指令:service ip ...

  6. rabbitmq:配置rabbitmq-management插件

    rabbitmq提供了一个图形的管理界面,用于管理.监控rabbitmq的运行情况,它是以插件的形式提供的,如果要启用需要启用插件 一.启用插件 rabbitmq-plugins enable rab ...

  7. pyppeteer进阶技巧

    记录一下在使用pyppeteer过程中慢慢发现的一些稍微高级一点的用法. 一.拦截器简单用法 拦截器作用于单个Page,即浏览器中的一个标签页.每初始化一个Page都要添加一下拦截器.拦截器实际上是 ...

  8. 看TED演讲——Why you will fail to have a great career

    讲者的名字叫Larry Smith,看起来很严肃很认真,有点黑色幽默的意思,演讲风格是非常让人喜欢的. 拿来howie老师的说法,拉老师给的你为什么没有一个great career的原因: 1. 知道 ...

  9. PAT 乙级 1002.写出这个数 C++/Java

    1002 写出这个数 (20 分) 题目来源 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n ...

  10. jmeter 测试带token的请求

    https://blog.csdn.net/wd1282988143/article/details/88048114 如果有一个登录接口需要服务端返回参数,再带着这个参数去请求才能完成登录,请问jm ...