【问题标题】:Hibernate EntityManager persist() and database round trip countHibernate EntityManager persist() 和数据库往返次数
【发布时间】:2012-05-16 16:54:00
【问题描述】:

现在我正在使用 entitymanager 使用我的 dao 使用这样的代码将对象实体列表插入数据库。

@Transaction
public void insertBatch(List<EntityObject> o){
    for(int i=0;i<o.size();i++){
         em.persist(o);
         if(o.size % 100 == 0){ //equal to JDBC batch size
              em.flush();
              em.clear();
         }
    }
}

当我通过将其添加到应用程序上下文中来监控 sql 语句时

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                           <property name="showSql" value="true"/>
        </bean>
    </property>

控制台中的结果会是这样的

Hibernate: insert into TABLE (FIELD1, FIELD2) values (?, ?)
Hibernate: insert into TABLE (FIELD1, FIELD2) values (?, ?)
...
...
...//untill reach 100 lines.
Hibernate: insert into TABLE (FIELD1, FIELD2) values (?, ?)

我的问题是。 这是否意味着每次我调用此方法时,它都会与数据库进行 100 次往返,还是只进行 1 次往返?

任何答案或见解将不胜感激。

谢谢。

【问题讨论】:

  • 只需要在调用flush()之前添加一条日志语句,你自己就可以看到了。

标签: database spring hibernate jpa hibernate-entitymanager


【解决方案1】:

如果你需要在 hibernate jpa 中进行批处理,请尝试设置

<property name="hibernate.jdbc.batch_size" value="100" />

根据 JPA 规范:

托管实体 X 将在或之前输入数据库 事务提交或作为刷新操作的结果。

所以,flush 是数据库往返。

顺便说一句,如果您将 hibernate-jpa 与 spring(事务)一起使用,那么 spring 将为您管理事务。您不需要调用 em.flush(理想情况下)

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 2010-09-27
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多