【问题标题】:Setting Hibernate property hibernate.jdbc.batch_size over explicitly calling session.flush()通过显式调用 session.flush() 设置 Hibernate 属性 hibernate.jdbc.batch_size
【发布时间】:2015-06-29 14:12:51
【问题描述】:

浏览hibernatehttps://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html的批处理文档。我尝试了一个在休眠配置文件中设置批量大小属性(hibernate.jdbc.batch_size=20)的示例,然后像这样进行刷新和清除:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

现在的问题是,如果我将 i 的值设置为 50,那么它会将记录刷新为 50 个批次。所以,如果我可以在循环中控制批次大小,为什么我需要设置 hibernate.jdbc.batch_size 20 属性。

谁能解释一下这两种方法的区别,即设置属性而不是显式调用flush。

【问题讨论】:

  • 你的ID字段是在CustomerIDENTITY还是手动设置的?
  • 我正在使用 GenerationType.TABLE 。因此为此维护了一个序列表。

标签: java hibernate batch-processing


【解决方案1】:

我的理解是您的循环和hibernate.jdbc.batch_size 在不同级别上运行。

您的循环对(您选择的)实体进行操作。但是单个客户可能需要多次插入(例如,当客户有多个地址时)。 所有这些插入都通过您的循环方法作为简单的单个插入执行。 flushclear 只是阻止会话无限增长。

另一方面,hibernate.jdbc.batch_size 会将相同且仅参数值不同的语句捆绑(插入)到单个语句中,并带有参数集列表。这种批处理语句的执行应该由数据库比等效的单个语句更有效地处理。

【讨论】:

  • 我明白了,所以你的意思是,如果属性设置为 20,hibernate.jdbc.batch_size 将在单个查询中捆绑 20 个插入。这里刷新,提供完全不同的服务这里的目的
  • 有道理,可能是在示例中它们的 i 和属性具有相同值的原因之一,设置为 20。因此,一旦查询被捆绑。我们应该把它刷新到数据库中。
  • 它不会将它们捆绑在一个 SQL 查询中。它将N个查询捆绑成一个批处理,最后使用docs.oracle.com/javase/6/docs/api/java/sql/…执行批处理。这限制了到数据库的往返次数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多