這樣有兩個大缺點:
(1):佔用大量的內存。
(2):處理海量數據的時候,執行update/delete語句就是海量了,而且一條update/delete語句只能操作一個對象,這樣頻繁的操作數據庫,性能低下應該是可想而知的了。
Hibernate3 發佈後,對批量更新/刪除操作引入了bulk update/delete,其原理就是通過一條HQL語句完成批量更新/刪除操作,很類似JDBC的批量更新/刪除操作。在性能上,比Hibernate2的批量更新/刪除有很大的提升。
Transaction tx=session.beginSession();
String HQL=”delete STUDENT”;
Query query=session.createQuery(HQL);
int size=query.executeUpdate();
tx.commit();
控制檯輸出了也就一條刪除語句Hibernate:delete from T_STUDENT,語句執行少了,性能上也與使用JDBC相差無幾,是一個提升性能很好的方法。當然爲了有更好的性能,筆者建議批量更新與刪除操作還是使用JDBC,方法以及基本的知識點與上面的批量插入方法2基本相同,這裏就不在冗述。
筆者這裏再提供一個方法,就是從數據庫端來考慮提升性能,在Hibernate程序端調用存儲過程。存儲過程在數據庫端運行,速度更快。以批量更新爲例,給出參考代碼。
首先在數據庫端建立名爲batchUpdateStudent存儲過程:
create or replace produre batchUpdateStudent(a in number) as
begin
update STUDENT set AGE=AGE+1 where AGE>a;
end;
調用代碼如下:
Transaction tx=session.beginSession();
Connection conn=session.connection();
String pd=”...{call batchUpdateStudent(?)}”;
CallableStatement cstmt=conn.PrepareCall(pd);
cstmt.setInt(1,20); //把年齡這個參數設爲20
tx.commit();
觀察上面的代碼,也是繞過Hibernate API,使用 JDBC API來調用存儲過程,使用的還是Hibernate的事務邊界。存儲過程無疑是提高批量處理性能的一個好方法,直接運行與數據庫端,某種程度上講把批處理的壓力轉接給了數據庫。