【发布时间】:2014-02-19 15:23:30
【问题描述】:
我正在尝试提高异步事务方法的性能。
在这个任务中,我必须从一个表中读取近 7500 条记录,对其进行详细说明,然后在另一个表中插入/更新相应的行。
我正在使用带有休眠功能的 spring data jpa。
为了获得ScrollableResults,我将EntityManager 注入到我的服务中。
这是我如何获得我的ScrollableResult 对象:
Session session = (Session) em.unwrap(Session.class);
ScrollableResults res = session.createQuery("from SourceTable s")
.setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);
while (res.next()){
.... // em.flush() called every 40 cycles
}
循环显示结果大约需要 60 秒。
这里是瓶颈。如果在我的循环中我执行一个简单的查询:
query = em.createQuery("from DestTable d where d.item.id = :id", DestTable.class);
while (res.next()){
query.setParameter("id", myId).getSingleResult();
}
执行时间变慢了 x10.. 大约需要 600 秒。
我尝试修改我的Session 或EntityManager 的参数:session.setFlushMode(FlushModeType.COMMIT);
em.setFlushMode(FlushModeType.COMMIT);
它提高了性能并消除了手动 flush() 方法,工作在 40 秒内完成!!!
所以我的问题是:
- 在
session或enityManager上调用setFlushMode有什么区别? - 为什么
setFlushMode(FlushModeType.COMMIT);以这种方式提高性能,而我只能通过手动刷新 entityManager 来获得相同的性能?
【问题讨论】:
标签: java spring hibernate entitymanager spring-data-jpa