出于开发目的,我可以在休眠中增加 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();
使用它应该会大大提高性能。
我想更新包含 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();
使用它应该会大大提高性能。