给定:@Stateless
EJB中的方法,JTA Mysql数据源以及我试图在一个周期中持续存在的大约5000个实体的列表:
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();
日志显示从15ms
逐渐降低性能,每个实体节省180ms
个时间。我相信Mysql服务器设置远远超出了这项任务的需要 - 它显示了CPU和I / O操作的微不足道的增加。每次更新后刷新EntityManager
都无效。
这种性能下降的原因是什么?请指出我正确的方向。
答案 0 :(得分:3)
看起来减速是由持久化上下文中的大量实体引起的(即在其会话缓存中)。 flush
在这里没有帮助,因为它不会从持久化上下文中删除实体。
如果您需要使用单个持久性上下文处理大量实体,建议定期使用clear()
清除上下文。