Hibernate批量處理其實從性能上考慮它是很不可取的浪費了很大的內存從它的機制上講Hibernate它是先把符合條件的數據查出來放到內存當中然後再進行操作實際使用下來性能非常不理想在筆者的實際使用中采用下面的第三種優化方案的數據是條數據插入數據庫主流台式機的配置需要約分鐘呵呵暈倒
總結下來有三種來處理以解決性能問題
繞過Hibernate API 直接通過 JDBC API 來做這個方法性能上是比較好的也是最快的
運用存儲過程
還是用Hibernate API 來進行常規的批量處理可以也有變變就變在我們可以在查找出一定的量的時候及時的將這些數據做完操作就
刪掉sessionflush()sessionevict(XX對象集) 這樣也可以挽救一點性能損失這個一定的量要就要根據實際情況做定量參考了一般為左右但效果仍然不理想
繞過Hibernate API 直接通過 JDBC API 來做這個方法性能上是比較好的也是最快的(實例為 更新操作)
Transaction tx=sessionbeginTransaction() //注意用的是hibernate事務處理邊界
Connection conn=sessionconnection()
PreparedStatement stmt=connpreparedStatement(update CUSTOMER as C set Csarlary=csarlary+ where csarlary>)
stmtexcuteUpdate()
txcommit() //注意用的是hibernate事務處理邊界
這小程序中采用的是直接調用JDBC 的API 來訪問數據庫效率很高避免了Hibernate 先查詢出來加載到內存再進行操作引發的性能問題
運用存儲過程但這種方式考慮到易植和程序部署的方便性不建議使用(實例為 更新操作)
如果底層數據庫(如Oracle)支持存儲過程也可以通過存儲過程來執行批量更新存儲過程直接在數據庫中運行速度更加快在Oracle數據庫中可以定義一個名為batchUpdateCustomer()的存儲過程代碼如下
create or replace procedure batchUpdateCustomer(p_age in number) as begin update CUSTOMERS set AGE=AGE+
where AGE>p_age
end
以上存儲過程有一個參數p_age代表客戶的年齡應用程序可按照以下方式調用存儲過程
tx = sessionbeginTransaction()
Connection con=sessionconnection()
String procedure = {call batchUpdateCustomer(?) }
CallableStatement cstmt = conprepareCall(procedure)
cstmtsetInt() //把年齡參數設為
cstmtexecuteUpdate()
txcommit()
從上面程序看出應用程序也必須繞過Hibernate API直接通過JDBC API來調用存儲過程
[] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/ky/201311/29173.html