掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流
Hibernate還是比較常用的,于是我研究了一下Hibernate插入操作,在這里拿出來和大家分享一下,希望對大家有用。

為銅鼓等地區(qū)用戶提供了全套網頁設計制作服務,及銅鼓網站建設行業(yè)解決方案。主營業(yè)務為成都網站建設、網站建設、銅鼓網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
在項目的開發(fā)過程之中,由于項目需求,我們常常需要把大批量的數據插入到數據庫。數量級有萬級、十萬級、百萬級、甚至千萬級別的。如此數量級別的數據用Hibernate插入操作,就可能會發(fā)生異常,常見的異常是OutOfMemoryError(內存溢出異常)。
首先,我們簡單來回顧一下Hibernate插入操作的機制。Hibernate要對它內部緩存進行維護,當我們執(zhí)行Hibernate插入操作時,就會把要操作的對象全部放到自身的內部緩存來進行管理。
談到Hibernate的緩存,Hibernate有內部緩存與二級緩存之說。由于Hibernate對這兩種緩存有著不同的管理機制,對于二級緩存,我們可以對它的大小進行相關配置,而對于內部緩存,Hibernate就采取了“放任自流”的態(tài)度了,對它的容量并沒有限制?,F在癥結找到了,我們做海量數據插入的時候,生成這么多的對象就會被納入內部緩存(內部緩存是在內存中做緩存的),這樣你的系統(tǒng)內存就會一點一點的被蠶食,如果最后系統(tǒng)被擠“炸”了,也就在情理之中了。
我們想想如何較好的處理這個問題呢?有的開發(fā)條件又必須使用Hibernate來處理,當然有的項目比較靈活,可以去尋求其他的方法。
筆者在這里推薦兩種方法:
1.優(yōu)化Hibernate,程序上采用分段插入及時清除緩存的方法。
2.繞過Hibernate API ,直接通過 JDBC API 來做批量插入,這個方法性能上是最 好的,也是最快的。
對于上述中的方法1,其基本是思路為:優(yōu)化Hibernate,在配置文件中設置Hibernate.jdbc.batch_size參數,來指定每次提交SQL的數量;程序上采用分段插入及時清除緩存的方法(Session實現了異步write-behind,它允許Hibernate顯式地寫操作的批處理),也就是每插入一定量的數據后及時的把它們從內部緩存中清除掉,釋放占用的內存。
設置Hibernate.jdbc.batch_size參數,可參考如下配置。
- ……
name=“ hibernate.jdbc.batch_size”>50 - ……
配置Hibernate.jdbc.batch_size參數的原因就是盡量少讀數據庫,Hibernate.jdbc.batch_size參數值越大,讀數據庫的次數越少,速度越快。從上面的配置可以看出,Hibernate是等到程序積累到了50個SQL之后再批量提交。
筆者也在想,Hibernate.jdbc.batch_size參數值也可能不是設置得越大越好,從性能角度上講還有待商榷。這要考慮實際情況,酌情設置,一般情形設置30、50就可以滿足需求了。
程序實現方面,筆者以插入10000條數據為例子,如
- Session session=HibernateUtil.currentSession();
- Transatcion tx=session.beginTransaction();
- for(int i=0;i<10000;i++)
- {
- Student st=new Student();
- st.setName(“feifei”);
- session.save(st);
- if(i%50==0)
- //以每50個數據作為一個處理單元
- {
- session.flush();
- //保持與數據庫數據的同步
- session.clear();
- //清除內部緩存的全部數據,及時釋放出占用的內存
- }
- }
- tx.commit();
- ……
【編輯推薦】

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流