還是用Hibernate API 來進行常規的批量處理可以也有變變就變在我們可以在查找出一定的量的時候及時的將這些數據做完操作就刪掉sessionflush()sessionevict(XX對象集) 這樣也可以挽救一點性能損失這個一定的量要就要根據實際情況做定量參考了……(實例為 保存操作)
業務邏輯為我們要想數據庫插入 條數據
tx=sessionbeginTransaction()
for(int i=i<i++)
{
Customer custom=new Customer()
customsetName(user+i)
sessionsave(custom)
if(i%==) // 以每個數據作為一個處理單元也就是我上面說的一定的量這個量是要酌情考慮的
{
sessionflush()
sessionclear()
}
}
這樣可以把系統維持在一個穩定的范圍……
在項目的開發過程之中由於項目需求我們常常需要把大批量的數據插入到數據庫數量級有萬級十萬級百萬級甚至千萬級別的如此數量級別的數據用Hibernate做插入操作就可能會發生異常常見的異常是OutOfMemoryError(內存溢出異常)
首先我們簡單來回顧一下Hibernate插入操作的機制Hibernate要對它內部緩存進行維護當我們執行插入操作時就會把要操作的對象全部放到自身的內部緩存來進行管理
談到Hibernate的緩存Hibernate有內部緩存與二級緩存之說由於Hibernate對這兩種緩存有著不同的管理機制對於二級緩存我們可以對它的大小進行相關配置而對於內部緩存Hibernate就采取了放任自流的態度了對它的容量並沒有限制現在症結找到了我們做海量數據插入的時候生成這麼多的對象就會被納入內部緩存(內部緩存是在內存中做緩存的)這樣你的系統內存就會一點一點的被蠶食如果最後系統被擠炸了也就在情理之中了
我們想想如何較好的處理這個問題呢?有的開發條件又必須使用Hibernate來處理當然有的項目比較靈活可以去尋求其他的方法
筆者在這裡推薦兩種方法
()優化Hibernate程序上采用分段插入及時清除緩存的方法
()繞過Hibernate API 直接通過 JDBC API 來做批量插入這個方法性能上是最 好的也是最快的
對於上述中的方法其基本是思路為優化Hibernate在配置文件中設置hibernatejdbcbatch_size參數來指定每次提交SQL的數量程序上采用分段插入及時清除緩存的方法(Session實現了異步writebehind它允許Hibernate顯式地寫操作的批處理)也就是每插入一定量的數據後及時的把它們從內部緩存中清除掉釋放占用的內存
[] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/ky/201311/29174.html