我有一个使用 EclipseLink JPA 的Web服务方法。此方法基本上将数据插入数据库。类似的东西:
public void insert(parameters....)
{
em.getTransaction().begin();
em.persist(employee);
em.getTransaction().commit();
// em.close();
}
现在在客户端,我有一个循环,每次迭代执行插入:
for(......)
{
websrvice.insert(parameters...)
}
在第一次迭代之后,我得到“No transaction is current active”异常。
然后我考虑在每次迭代后放一个Thread.sleep(2000)
来解决问题。
直观地说,这可能是因为另一个事务在后者完成之前尝试提交而导致错误。但是我想,为什么第二次插入甚至会在第一次插入未完成时开始?困惑。
答案 0 :(得分:1)
您不应在交易结束时关闭实体经理。
删除此行:
em.close();
http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#close()
“关闭应用程序管理的实体管理器。在调用close方法之后,EntityManager实例上的所有方法以及从中获取的anyQuery和TypedQuery对象都将抛出IllegalStateException,除了forgetProperties,getTransaction和isOpen(将返回false) “
编辑:
尝试使用第一个getTransaction调用返回的事务,而不是两次调用此方法:
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.persist(employee);
transaction.commit();