Hibernate批量處理的性能優化問題
Posted on 2006-12-27 11:16 weibogao 閱讀(5132) 評論(0) 編輯 收藏 所屬分類: software development
Hibernate批量處理:
Hibernate批量處理其實從性能上考慮,它是很不可取的,浪費了很大的內存。從它的機制上講,Hibernate它是先把符合條件的數據查出來,放到內存當中,然后再進行操作。實際使用下來性能非常不理想,在筆者的實際
使用中采用下面的第三種優化方案的數據是:100000條數據插入數據庫,主流臺式機的配置,需要約30分鐘,呵呵,暈倒.
總結下來有三種來處理以解決性能問題:
1:繞過Hibernate API ,直接通過 JDBC API 來做,這個方法性能上是比較好的。也是最快的.
2:運用存儲過程。
3:還是用Hibernate API 來進行常規的批量處理,可以也有變,變就變在,我們可以在查找出一定的量的時候,及時的將這些數據做完操作就
刪掉,session.flush();session.evict(XX對象集); 這樣也可以挽救一點性能損失。這個“一定的量”要就要根據實際情況做定量參考了。一般為30-60左右,但效果仍然不理想.
?
?
1:繞過Hibernate API ,直接通過 JDBC API 來做,這個方法性能上是比較好的,也是最快的。(實例為 更新操作)
?
Transaction tx=session.beginTransaction(); //注意用的是hibernate事務處理邊界
Connection conn=session.connection();
PreparedStatement stmt=conn.preparedStatement("update CUSTOMER as C set C.sarlary=c.sarlary+1 where c.sarlary>1000");
stmt.excuteUpdate();
tx.commit(); //注意用的是hibernate事務處理邊界
這小程序中,采用的是直接調用JDBC 的API 來訪問數據庫,效率很高。避免了Hibernate 先查詢出來加載到內存,再進行操作引發的性能問題
。
2:運用存儲過程。但這種方式考慮到易植和程序部署的方便性,不建議使用.(實例為 更新操作)
如果底層數據庫(如Oracle)支持存儲過程,也可以通過存儲過程來執行批量更新。存儲過程直接在數據庫中運行,速度更加快。在Oracle數
據庫中可以定義一個名為batchUpdateCustomer()的存儲過程,代碼如下:
代碼內容
create or replace procedure batchUpdateCustomer(p_age in number) as
begin
update CUSTOMERS set AGE=AGE+1 where AGE>p_age;
end;?
以上存儲過程有一個參數p_age,代表客戶的年齡,應用程序可按照以下方式調用存儲過程:
代碼內容
tx = session.beginTransaction();
Connection con=session.connection();
String procedure = "{call batchUpdateCustomer(?) }";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年齡參數設為0
cstmt.executeUpdate();
tx.commit();?
從上面程序看出,應用程序也必須繞過Hibernate API,直接通過JDBC API來調用存儲過程。
3:還是用Hibernate API 來進行常規的批量處理,可以也有變,變就變在,我們可以在查找出一定的量的時候,及時的將這些數據做完操作就
刪掉,session.flush();session.evict(XX對象集); 這樣也可以挽救一點性能損失。這個“一定的量”要就要根據實際情況做定量參考了。。
(實例為 保存操作)
業務邏輯為:我們要想數據庫插入10 0000 條數據
tx=session.beginTransaction();
for(int i=0;i<100000;i++)
{
Customer custom=new Customer();
custom.setName("user"+i);
session.save(custom);
if(i%50==0) // 以每50個數據作為一個處理單元,也就是我上面說的“一定的量”,這個量是要酌情考慮的
{
session.flush();
session.clear();
}
}
這樣可以把系統維持在一個穩定的范圍....