出于开发目的,我可以在休眠中增加 jdbc 批处理大小吗?

Can I increase jdbc batch size in hibernate for development purposes?

我想更新包含 80 万行的 table 中的列值。因此,我使用 Hibernate 4.3.6.Final 作为 ORM 框架创建了一个简单的 Java 应用程序。

我已将 JDBC 批处理配置为 45 作为值,并且已禁用二级缓存。

<property name="hibernate.jdbc.batch_size">45</property>
<property name="hibernate.cache.use_second_level_cache">false</property>

我可以将 batch_size 增加到 200 吗?因为在休眠中 docs 他们提到:

Before batch processing, enable JDBC batching. To enable JDBC batching, set the property hibernate.jdbc.batch_size to an integer between 10 and 50.

这是代码(简体):

session.beginTransaction();

List<MyEntity> entities = findAllEntities();
logger.info("Number of fetched rows: " + entities.size());

int count = 0;

for (MyEntity entity : entities) {

    // change some fields of the entity

    session.update(entity);

    if ( ++count % HIBERNATE_BACH_SIZE == 0 ) {
       //flush a batch of updates and release memory:
       session.flush();
       session.clear();
    }
}

session.getTransaction().commit();

获取所有实体,然后一个一个地遍历它们非常乏味,而且总是会导致性能不佳。

因为您似乎执行了无条件更新(即没有检查来定义哪个对象将更新其字段),您应该使用简单的 HQL 查询在单个操作中执行更新.

例如,假设您要更新的 table 是 MyEntity,那么您的查询将如下所示:

int rows = session.createQuery("UPDATE MyEntity ME SET me.myField1=:newField1, me.myField2=:newField2)
     .setString("newField1", "Something")
     .setString("newField2", "Something")
     .executeUpdate();

使用它应该会大大提高性能。