2016-03-04 47 views
1

我有60K條記錄要插入。我想批100使用彈簧數據的批量插入

下面提交記錄是我的代碼

for(int i = 0 ;i < 60000; i++) { 
    entityRepo.save(entity); 
    if(i % 100 == 0) { 
     entityManager.flush(); 
     entityManager.clear(); 
     LOG.info("Committed = " + i); 
    } 
} 
entityManager.flush(); 
entityManager.clear(); 

我一直在檢查數據庫時,我收到了日誌,但我沒有看到記錄得到承諾。什麼是我錯過了?

回答

2

僅撥打flush()clear()是不夠的。您需要將Transaction參考,並調用.commit()(從reference guide

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<100000; i++) { 
    Customer customer = new Customer(.....); 
    session.save(customer); 
} 
tx.commit(); 
session.close(); 
+1

這段代碼是否使用spring數據? – Edi

+0

爲Spring注入一個TransactionManager – Raffaele

1

我認爲兩種方法可以做到這一點,因爲定義交易聲明,並從外部方法調用。

父級:

List<Domain> domainList = new ArrayList<>(); 
for(int i = 0 ;i < 60000; i++) { 
    domainList.add(domain); 
    if(i%100 == 0){ 
    child.saveAll(domainList); 
    domainList.clear(); 
    } 
} 

兒童:

@Transactional 
public void saveAll(List<Domain> domainList) { 
} 

此定期調用由父所定義的聲明性方法。

另一個是手動開始和結束事務並關閉會話。