【问题标题】:JPA: How to commit?JPA:如何提交?
【发布时间】:2018-07-15 11:31:05
【问题描述】:

我正在使用JPA向数据库中插入很多对象(75.000),知道下面的代码可以多次调用...

由于我不希望内存泄漏,我要求 JPA 在 5.000 persist() 之后刷新 EntityManager。事实上,刷新并没有提交任何东西......

@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() 方法就会变得非常慢,为什么?

【问题讨论】:

  • flush() 刷新。它不承诺。 persist() 持续存在。它没有提交。如果您希望提交 5000 次插入,请确保调用您的方法并提交新事务:@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

标签: java jpa jta


【解决方案1】:

如何提交?

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

性能 - JPA

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

性能 - 非 JPA

您为什么使用 JPA?在您的用例中比较 JPA 和普通 JDBC 的性能。如果性能对您至关重要,而 JDBC 本质上更快,为什么还要坚持使用 JPA?当您想以面向对象的方式处理数据时,JPA 非常有用 - 您想要使用更高的抽象,您想要检索和持久化对象而不关心底层细节,您想要以自然的方式加载相关的对象而不用思考的连接和索引。但它可能不是批量处理数据的最佳选择。在纯 JDBC 中完成批量处理可能会更有效。思考、比较、决定。

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 2015-04-08
    • 1970-01-01
    • 2011-03-13
    • 2014-04-16
    • 2010-11-16
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多