java—我可以在hibernate中增加jdbc批处理大小以用于开发吗?

whlutmcx  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(272)

我想更新一个包含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();
jvlzgdj9

jvlzgdj91#

获取所有的实体,然后逐个遍历它们是非常乏味的,而且总是会导致性能不理想。
既然您似乎执行了无条件更新(即没有检查来定义哪个对象将更新其字段),那么您应该使用一个简单的 HQL 查询以在单个操作中执行更新。
例如,给定要更新的表是 MyEntity 那么您的查询将如下所示:

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

使用它可以大大提高性能。

相关问题