坚持表现逐渐下降

时间:2012-04-13 12:34:25

标签: java mysql jpa ejb eclipselink

给定:@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都无效。

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

1 个答案:

答案 0 :(得分:3)

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

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