栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【JPA】记录JPA批量处理的优化

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【JPA】记录JPA批量处理的优化

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

根据id逐条删除

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

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

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

@Repository
public interface AllDeviceRepository extends JpaRepository {

    @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;

    @CreatedDate
    private Date createTime;

    @LastModifiedDate
    private Date updateTime;

}

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

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

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/630784.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号