簡體   English   中英

為了開發目的,我可以增加 hibernate 中的 jdbc 批量大小嗎?

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

我想更新包含 800k 行的表中的列值。 因此,我創建了一個簡單的 Java 應用程序,其中 Hibernate 4.3.6.Final作為 ORM 框架。

我已將 JDBC 批處理配置為 45 作為值,並且我已禁用二級緩存。

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

例如,我可以將batch_size增加到 200 嗎? 因為在 hibernate 文檔中他們提到:

在批處理之前,啟用 JDBC 批處理。 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();

獲取所有實體,然后一個一個地遍歷它們是相當乏味的,並且總是會導致次優的性能。

由於您似乎執行了無條件更新(即沒有檢查來定義哪個 object 將更新其字段),您應該使用簡單的HQL查詢在單個操作中執行更新。

例如,假設您要更新的表是MyEntity ,那么您的查詢將如下所示:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM