2012-04-13 136 views
2

考虑:坚持性能逐渐降低

List<MyObj> objList = entityManager.createNamedQuery("Q1", MyObj.class).getResultList(); 
for(MyObj obj : objList) { 
    long start_time = Calendar.getInstance().getTimeInMillis(); 
    entityManager.persist(obj); 
    long end_time = Calendar.getInstance().getTimeInMillis(); 
    logger.info("Object saved in " + (end_time - start_time) + "ms"); 
} 
entityManager.close(); 

日志显示逐渐降低的性能:在@Stateless EJB,JTA MySQL数据源,并且我想在一个周期内持续存在约5000实体清单方法15ms高达180ms节省每个实体的时间。我相信Mysql的服务器设置远远超出了这项任务的需求 - 它显示了CPU和I/O操作的微不足道的增加。 Flushing EntityManager每次更新后都不起作用。

这种性能下降的原因是什么?请指向正确的方向。

回答

3

看起来减速是由持久化上下文(即在其会话缓存中)的大量实体引起的。 flush在这里没有帮助,因为它不会从持久化上下文中删除实体。

如果您需要使用单个持久性上下文处理大量实体,建议定期清除clear()的上下文。