我正在使用JPA将许多对象插入数据库(75.000),因为知道下面的代码可以多次调用...
由于我不希望发生内存泄漏,因此我要求JPA在5.000 EntityManager
之后刷新persist()
。确实,冲洗并没有提交任何东西...
@Stateless
public class TwitterScheduler {
@EJB
private EntityUserFacade facade;
// ids are 5.000
public void do(ids) {
for (long id : ids.getIDs()) {
Entity e = new Entity();
e.set(...);
this.facade.create(e);
}
this.facade.getEntityManager().flush();
}
}
@TransactionManagement(TransactionManagementType.BEAN)
注释我的班级,persist()
将自动commit()
进行交易(如果我是正确的话)。但是我担心性能/内存泄漏,我应该吗?
是否应该使用@Resource UserTransaction utx;
将事务以某种方式加入JPA?如果可以,怎么办?因为无法将“事务管理”设置为Container
。
我也想知道,如果我不刷新EntityManager,就会发生内存泄漏。如果我使用this.facade.getEntityManager().flush();
刷新EntityManager,则我调用do()
方法越多,速度就变得很慢,为什么?
答案 0 :(得分:0)
如何提交?
在类或方法级别上使用事务属性。根据您的情况,您可能需要
@TransactionAttribute(TransactionAttributeType.REQUIRED)
要么
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
性能-JPA
JDBC可以以 batch 模式进行某些操作。您可以在实体级别(作为JPA批注)以及JPA实现特定级别(例如Hibernate属性文件)上使用它。
性能-非JPA
为什么要使用JPA?在您的用例中比较JPA和纯JDBC的性能。如果性能对您至关重要,并且JDBC实质上要快,那么为什么要坚持使用JPA?当您想以一种面向对象的方式使用数据时,JPA是很好的选择-您想要使用更高的抽象度,想要检索和持久化对象而不关心低级细节,想要以自然的方式加载相关对象而无需考虑连接和索引。但这可能不是批量处理数据的最佳选择。在纯JDBC中进行批量处理时,效率可能更高。思考,比较,决定。