2011-11-29 29 views
3

我需要插入大量的數據中使用Hibernate數據庫中,我一直在尋找從休眠批量插入,我現在用的就是類似手冊上的例子:hibernate批量插入 - 如何刷新工作?

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 

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

tx.commit(); 
session.close(); 

,但我看到的是齊平不會將數據寫入數據庫。 讀取它,如果代碼在事務中,則在事務執行提交之前,不會將任何內容提交到數據庫。

那麼需要使用flush/clear?似乎沒用,如果數據沒有寫在數據庫上,那麼他們在內存中。

如何強制hibernate在數據庫中寫入數據?直到事務被提交

感謝

回答

5

數據發送到數據庫,並且不再在內存中。它只是在事務提交之前才確定持久化。這是exacltly一樣,如果你執行下面的語句序列中的任何數據庫工具:

begin; 
insert into ... 
insert into ... 
insert into ... 
// here, three inserts have been done on the database. But they will only be made 
// definitively persistent at commit time 
... 
commit; 

沖洗包括在執行INSERT語句。

提交包含執行提交語句。

1

的數據將被寫入到數據庫中,但根據事務隔離級別,你不會看到他們(其他事務)。

使用一些sql語句記錄器,打印通過數據庫連接傳輸的statmentes,然後您會看到statmentes被髮送到數據庫。

1

爲了獲得最佳效果,您還必須提交交易。刷新和清除會話會清除休眠緩存,但數據會移動到JDBC連接緩存中,並且仍然不受影響(不同的RDBMS /驅動程序會顯示不同的行爲) - 只是將問題轉移到其他位置而沒有真正改善性能。

1

在上述位置有flush()可以節省您的記憶,因爲您的會話將定期清除。否則,您將在內存中擁有100000個對象,並且可能會耗盡內存以獲得更大的計數。檢出this article