JPA:如何提交?

时间:2018-07-15 11:31:05

标签: java jpa jta

我正在使用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();
    }
}
  1. 如果我用@TransactionManagement(TransactionManagementType.BEAN)注释我的班级,persist()将自动commit()进行交易(如果我是正确的话)。

但是我担心性能/内存泄漏,我应该吗?

  1. 是否应该使用@Resource UserTransaction utx;将事务以某种方式加入JPA?如果可以,怎么办?因为无法将“事务管理”设置为Container

  2. 我也想知道,如果我不刷新EntityManager,就会发生内存泄漏。如果我使用this.facade.getEntityManager().flush();刷新EntityManager,则我调用do()方法越多,速度就变得很慢,为什么?

1 个答案:

答案 0 :(得分:0)

如何提交?

在类或方法级别上使用事务属性。根据您的情况,您可能需要 @TransactionAttribute(TransactionAttributeType.REQUIRED) 要么 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

性能-JPA

JDBC可以以 batch 模式进行某些操作。您可以在实体级别(作为JPA批注)以及JPA实现特定级别(例如Hibernate属性文件)上使用它。

性能-非JPA

为什么要使用JPA?在您的用例中比较JPA和纯JDBC的性能。如果性能对您至关重要,并且JDBC实质上要快,那么为什么要坚持使用JPA?当您想以一种面向对象的方式使用数据时,JPA是很好的选择-您想要使用更高的抽象度,想要检索和持久化对象而不关心低级细节,想要以自然的方式加载相关对象而无需考虑连接和索引。但这可能不是批量处理数据的最佳选择。在纯JDBC中进行批量处理时,效率可能更高。思考,比较,决定。