我有一段代码可以迭代 ScrollableResults 并对每个元素进行一些计算。迭代被事务包围。
EntityTransaction transaction = emf.createEntityManager().getTransaction();
transaction.begin();
ScrollableResults scrollableResults = em.unwrap(Session.class).createQuery("my select query").scroll();
while (scrollableResults.next()){
MyEntity entity= (MyEntity) scrollableResults.get(0);
someCalculation(entity);
}
transaction.commit();
em.close();
我使用 ScrollableResults 因为我不想将所有项目加载到内存另一方面我不想让事务长时间保持打开状态,因为迭代可能需要一些时间。我省略了开始和提交事务,我仍然能够迭代结果集。这种情况的最佳解决方案是什么?我应该长时间保持交易开放还是根本不使用交易?