2017-09-12 111 views
0

所以我試圖配置休眠進行批處理的目的。我已經構建了一個示例應用程序,並根據Hibernates文檔進行了配置。休眠批處理

但是在配置Hibernate註銷SQL之後,它看起來好像沒有執行批量插入,而只是單獨插入。我讀這本日誌錯了嗎?

所以我在我的Spring Boot應用程序中配置了以下屬性。

spring.jpa.properties.hibernate.jdbc.batch_size=10 
spring.jpa.properties.hibernate.show_sql=true 
spring.jpa.properties.hibernate.format_sql=true 

這是我非常基本的批作家..

@Transactional public class BatchWriter {

private EntityManager entityManager; 

private int batchSize; 

public BatchWriter(EntityManager entityManager, int batchSize) { 
    this.entityManager = entityManager; 
    this.batchSize = batchSize; 
} 

public void writeBatchOfCustomers(int numOf) { 
    for(long i = 0; i <= numOf; i++) { 
     Customer customer = new Customer(i); 
     entityManager.persist(customer); 

     if (i % batchSize == 0) { //20, same as the JDBC batch size 
      //flush a batch of inserts and release memory: 
      entityManager.flush(); 
      entityManager.clear(); 
     } 
    } 
} 

}

現在我正在此插入20個客戶,例如在休眠日誌,我看到下面的20倍:

Hibernate: 
insert 
into 
    customer 
    (first_name, last_name, id) 
values 
    (?, ?, ?) 

我在這裏錯過了什麼?

它目前使用H2數據庫的Spring Boot自動配置。然而,我將最終使用Spring Batch和Oracle數據庫,它將使用大約35個屬性插入大約30k個對象。

任何幫助表示讚賞。

感謝,

+0

爲什麼在配置JPA時使用普通的SessioNFactory?你應該使用'EntityManager'而不是'SessionFactory'。 –

+0

由於該代碼已經足夠複製掉休眠文檔,因此它只是丟棄。我沒有看到影響? – buymypies

+0

同樣,您正在配置JPA,但正在使用普通的'SessionFactory'。你正在配置X,但是使用Y.你爲什麼認爲配置X會影響Y.如前所述,使用'EntityManager'(只需將它注入到你的作者中)並用'@ Transactional'註釋這個類。刪除您擁有的任何Hibernate配置,並讓Spring Boot爲您配置JPA。 –

回答

1

所以看來休眠SQL日誌記錄是相當誤導性(在我看來)。

我的配置實際上是批處理。

我添加了DEBUG級記錄器該類:

org.hibernate.engine.jdbc.batch.internal.BatchingBatch

當前在休眠版本5.0.12命名。 (以爲它以前被命名爲別的東西)。

在這個類中你可以看到它實際上是批處理。