在jpa的使用过程中,发现用jpa内置的deleteAll()方法和saveAll()方法,效率都有所不足。看了下它调用的sql语句,发现删除是根据id一条条的删除,批量保存也是逐条先查后存,感觉明显是这个影响了运行速度。

根据id逐条删除

若是部分批量删除还可以理解,但是当想要整表数据删除时,就显得效率不足。而且delete后,数据库中的空间不会得到释放,后续查询也还是性能较差。

逐条保存且每次都要做一个查询

网上看了看有没有大佬有合适的优化方法,大致还是通过原生sql的形式优化处理。

@Repository
public interface AllDeviceRepository extends JpaRepository<AllDeviceDO,Integer> {@Transactional@Modifying@Query(value = "truncate table all_device_info",nativeQuery = true)void truncateTable();
}

删除效率有明显提升。

可以看到直接执行这条原生sql,速度明显提升,且释放了空间。注意:truncate table有因为权限或锁竞争的风险而导致一直堵塞住运行不下去。此时可以尝试换delete table的原生sql。

然后就是批量新增。自增主键id的策略模式会导致先查询后插入的情况,默认关闭批量操作。所以如果也无需求对表id没有什么要求的话,使用uuid的主键帮助会更大。

@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseDO {@Id@GenericGenerator(name = "id-generator", strategy = "uuid")@GeneratedValue(generator = "id-generator")protected String pid;@CreatedDateprivate Date createTime;@LastModifiedDateprivate Date updateTime;}

对于批量操作也可以做一些配置,直接开启批量。

spring.jpa.properties.hibernate.jdbc.batch_size=500
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true

修改后再运行一遍,可以发现不会在进行先查后插的形式进行批量插入了。

当然,插入前查询对一些业务场景也是很有帮助的。这里主要针对的是追求批量新增时的效率问题,提高性能。

=================================分割线===================================

更新一下,上面的方式修改后,效率有所提升,但是实际底层依旧会有一个查询判断的操作,而且select for update容易造成死锁问题。所以最好还是使用HQL的方式,自己写一个批量操作,首先就可以降低死锁发生的概率,然后还可以避免查询提升效率。

这是针对数据量大的情况,对于事务回滚、数据可靠的要求要低于追求效率。而且 数据量大的情况下,多线程批量操作造成的死锁的概率更大(这里指使用jpa内置的save和delete方法)。所以针对业务场景,可以考虑HQL手写sql。

希望死锁问题的坑对大家有帮助。此处针对jpa,换一个orm框架,比如mybatis,也许效果会更好,避免此类问题产生。

附上postgre数据库死锁处理方法:

select * from pg_stat_activity where datname = '数据库名称'

# 用这个sql可以找出,当前连接执行的sql语句,里面可以看到死锁状态的sql语句以及对应pid。

select pg_cancel_backend('pid');

# 用这个sql可以关闭对应死锁状态的pid任务

select pg_terminate_backend ('pid')

# 用这个可以关闭idle in transaction状态的pid任务

【JPA】记录JPA批量处理的优化相关推荐

  1. Spring Data JPA 梳理 - JPA是什么

    总结: JPA是java的标准,不是Spring的标准 java标准中一般通过Meta-INF文件规范开发层面的事情,JPA也不例外,使用persistence.xml JPA定义了Entity 到 ...

  2. c mysql批量插入优化_MySQL实现批量插入以优化性能的教程

    这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时 ...

  3. mysql如何优化性能优化_如何优化性能?MySQL实现批量插入以优化性能的实例详解...

    这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时 ...

  4. JDBC批量Insert深度优化(有事务)

    JDBC批量Insert深度优化(有事务) 环境: MySQL 5.1 RedHat Linux AS 5 JavaSE 1.5 DbConnectionBroker 微型数据库连接池 测试的方案: ...

  5. spring data jpa 与 jpa的区别

    spring data jpa 与 jpa的区别 - sinat_39789638的博客 - CSDN博客 https://blog.csdn.net/sinat_39789638/article/d ...

  6. jpa配置(jpa配置连接池)

    JPA的实体状态有哪些呢? 该接口拥有众多执行数据查询的接口方法: Object getSingleResult():执行SELECT查询语句,并返回一个结果: List getResultList( ...

  7. 记录一次批量插入的优化历程

    一.前言 测试妹子反馈了一个bug,说后台报了个服务器异常--保存一个数量比较大的值时,比如 9999,一直在转圈圈,直到最后报了一个服务器异常.我接过了这个bug,经过仔细查看代码后发现,代码卡在了 ...

  8. java jpa hibernate_java - JPA和Hibernate - Criteria与JPQL或HQL

    java - JPA和Hibernate - Criteria与JPQL或HQL 使用Criteria或HQL有哪些优缺点? Criteria API是一种很好的面向对象的方式来表达Hibernate ...

  9. mysql批量提交的优化

    背景 用户修改布局时,需要批量更新mysql的xxxx_layout_xxxx表.批量操作的数据量是2-30条/次.批量操作是这次项目在技术上比 较关键的一个点,之前批量操作做过性能上的测试,mysq ...

最新文章

  1. python函数式编程思想_以python为例,浅谈函数式编程思想
  2. 产品经理必知必会知识-竞品分析需求实战报告
  3. 修改mysql字符集 为utf8_修改mysql数据库字符集为UTF8的
  4. ASP.Net缓存 1
  5. linux服务 运维案例,linux运维实战练习案例-2015年12月20日-12月31日
  6. package.json的进阶
  7. 【GitHub】知识蒸馏从入门到精通
  8. 二分图中的最大匹配数等于最小点覆盖数的证明
  9. 【python】获取http响应
  10. 【Win10】【开始菜单打不开】任务栏修复
  11. Vue中Swiper以及vue-awesome-swiper的安装和问题
  12. android 智能电视 电视盒子 安卓嵌入式硬件LAN压力测试
  13. 杀戮空间2游戏开服架设好后怎么查找自己服务器
  14. c语言累加和校验_循环冗余校验(CRC)算法入门
  15. Python 爬虫篇#笔记02# | 网页请求原理 和 抓取网页数据
  16. R语言数据科学:变量选择(一)逐步回归法
  17. 七岁的OpenStack成熟了?企业就绪了?
  18. oracle longtext类型,ORACLE的ALL_VIEWS数据字典text字段long类型问题
  19. 预测明天什么股能涨起来,预测明天什么股能涨停
  20. 正交矩阵,(标准)正交基,正交投影,正交分解定理,最佳逼近定理,格拉姆-施密特方法求正交基(手算+MATLAB),QR分解(手算+MATLAB计算、分析)

热门文章

  1. ggplot2 annotate()函数
  2. 参加2022年全国设备监测诊断与维护学术会议感想
  3. 牛顿迭代法是一种速度很快的迭代方法,但是它需要预先求得导函数。若用差商代替导数,可得下列弦截法
  4. 修改Android开机画面
  5. 解决 oracle 错误ORA-01033
  6. 微信扫描登录(生成二维码)
  7. 485通讯线是几芯的_rs485总线是啥线?rs485总线是几芯线
  8. unity调试手机游戏(Android)【模拟器+真机】+设置运行时游戏横屏
  9. 均值滤波与中值滤波(python实现)
  10. idea的注释老是从行首开始