一次JPA性能优化历险

最近的项目中使用JPA实现批量数据导入数据库。
既然是批量,那么必然要考虑性能问题了,所以就有了这篇博文。
首先,介绍下使用的API:
1.javax.persistence.EntityManager.clear()
在这次优化中,使用的关键,用于清空缓存。
2.javax.persistence.EntityManager.flush()
用于将缓存中的数据回写数据库。
3.javax.persistence.EntityManager.persist(Object)
用于将新建实体放入缓存。

一般新增一条记录会使用如下语句:
 Record record = new Record();
...
record.setXXX(...);
em.persist(record);
em.fulsh();


以上写法在非批量处理时,没有多大性能问题,但是当在循环中调用就有很大的性能问题了。
[list]
[*]循环次数 耗时比例数
[*]1000 30
[*]500 7
[*]100 1
[/list]

以上数据只是大概比例,但是可以看出,循环次数与耗时不成正比例,即非线性增长。

刚看到这些数据时,猜测是循环中fulsh()调用频繁,所以性能低下。

于是,将fulsh()放到循环外,性能略有好转,但是耗时仍然是非线性增长。

能不能是缓存的问题?

试试在循环中每次调用em.clear(),终于解决了非线性增长耗时问题。
 Record record = new Record();
...
record.setXXX(...);
em.persist(record);
em.fulsh();
em.clear();

结论:循环次数高-->数据量大-->缓存负载大。
使用缓存时,要具体问题具体分析。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值