2

给定:@StatelessEJB、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更新后刷新都没有效果。

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

4

1 回答 1

3

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

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

于 2012-04-13T12:44:13.127 回答