2012-04-13 72 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()的上下文。