2013-10-04 27 views
1

如何在單個語句中插入所有行。這是我的代碼,但需要很長時間才能插入行。如何在單個語句中插入所有行

for(Myobject object : objectList) 
     getCurrentSession().save(object); 

它爲每條記錄創建一個語句;

insert into myobject (id, type) values (?, ?) 
insert into myobject (id, type) values (?, ?) 
.... 

我想要做的是;

insert into myobject (id, type) values (?, ?), (?, ?), (?, ?) ......(?, ?); 

有沒有什麼辦法可以創建這個語句?

回答

3

您可能感興趣的batch inserts on Hibernate tutorial

問題不在於save()操作,因爲所有這些操作都是爲了將​​對象保存在第一級緩存中(在會話中使其持久化),但觸發插入的操作是flush()。他們推薦以下方法以達到良好的表現

據說這也是在教程中 - 我還沒有嘗試過 - 你可以得到OutOfMemoryException非常高的行數作爲持久性,他們似乎建議20作爲批量大小。

當爲了控制第一級高速緩存的大小而定期創建新對象時,定期flush()然後清除會話。

for (int i=0; i<objectList.size(); i++) { 
    getCurrentSession().save(objectList.get(i)); 
    if (i % 20 == 0) { //20, same as the JDBC batch size 
    //flush a batch of inserts and release memory: 
    session.flush(); 
    session.clear(); 
    } 
} 

編輯設置的配置文件中也hibernate.jdbc.batch_size到20或50,如果你想。 Hibernate將不得不將它們分組,並代替20將您應該只有一個由20分組:

into myobject (id, type) values (id1, val1), (id2, val2), ......(id20, val20) 
+0

它不會改變任何東西。仍嘗試逐個插入所有行。 – hellzone

+0

它應該將它們中的20個分組。你也可以在SO上找到我剛剛發現的[question](http://stackoverflow.com/questions/6687422/hibernate-batch-size-confusion)上的接受迴應。 –

+0

我不明白的是我想添加10.000條記錄,它需要將近115秒,用你的方式(20分組),它需要114秒。 – hellzone

0

使用本機查詢(原始SQL):

entityManager 
    .createNativeQuery("insert into myobject (id, type) values (?, ?), (?, ?), (?, ?) ......(?, ?)") 
    .setParameter(1, foo) 
    // etc 
    .execute(); 
+0

事情是我有10.000記錄:) – hellzone

+1

我不會使用休眠。我會通過命令行工具加載。一旦記錄更新計數超過幾十個,Hibernate就沒有希望了。 – Bohemian

0

只啓用「調試」爲休眠級別的記錄,看看是否批插入正在發生。

log4j.rootLogger=TRACE, file, stdout 

    log4j.logger.org.hibernate=TRACE 

    log4j.logger.org.hibernate.type=ALL 

您應該看到下面的日誌。

DEBUG AbstractBatcher:66 - Executing batch size: 20 

在調用ps.executeBatch()之前插入您正在看到的語句。第org.hibernate.jdbc.BatchingBatcher的第70行。