我想更新一个包含800k行的表中的列值。因此,我用hibernate4.3.6.final作为orm框架创建了一个简单的java应用程序。
我已经用45作为值配置了jdbc批处理,并且禁用了二级缓存的使用。
<property name="hibernate.jdbc.batch_size">45</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
我能提高价格吗 batch_size
例如200?因为在hibernate文档中他们提到:
在批处理之前,启用jdbc批处理。要启用jdbc批处理,请将hibernate.jdbc.batch\u size属性设置为10到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();
1条答案
按热度按时间jvlzgdj91#
获取所有的实体,然后逐个遍历它们是非常乏味的,而且总是会导致性能不理想。
既然您似乎执行了无条件更新(即没有检查来定义哪个对象将更新其字段),那么您应该使用一个简单的
HQL
查询以在单个操作中执行更新。例如,给定要更新的表是
MyEntity
那么您的查询将如下所示:使用它可以大大提高性能。