最近的项目中使用JPA实现批量数据导入数据库。
既然是批量,那么必然要考虑性能问题了,所以就有了这篇博文。
首先,介绍下使用的API:
1.javax.persistence.EntityManager.clear()
在这次优化中,使用的关键,用于清空缓存。
2.javax.persistence.EntityManager.flush()
用于将缓存中的数据回写数据库。
3.javax.persistence.EntityManager.persist(Object)
用于将新建实体放入缓存。
一般新增一条记录会使用如下语句:
以上写法在非批量处理时,没有多大性能问题,但是当在循环中调用就有很大的性能问题了。
[list]
[*]循环次数 耗时比例数
[*]1000 30
[*]500 7
[*]100 1
[/list]
以上数据只是大概比例,但是可以看出,循环次数与耗时不成正比例,即非线性增长。
刚看到这些数据时,猜测是循环中fulsh()调用频繁,所以性能低下。
于是,将fulsh()放到循环外,性能略有好转,但是耗时仍然是非线性增长。
能不能是缓存的问题?
试试在循环中每次调用em.clear(),终于解决了非线性增长耗时问题。
结论:循环次数高-->数据量大-->缓存负载大。
使用缓存时,要具体问题具体分析。
既然是批量,那么必然要考虑性能问题了,所以就有了这篇博文。
首先,介绍下使用的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(),终于解决了非线性增长耗时问题。
结论:循环次数高-->数据量大-->缓存负载大。
使用缓存时,要具体问题具体分析。