Hibernate中Session方法介紹
查詢系統往往是一個系統性能表現的重要的方面,相對于刪除和更新來說,查詢的機制在很大程度上決定了一個系統的性能。
Hibernate2中,Session方法接口提供了如下的辦法完成批量數據的查詢(Session.locad單一數據的查詢)
List Session.find(…..) Iterator Session.iterator(……) |
Hibernate3中上述接口已經從Session方法中廢除,統一由Query接口提供,分別對應如下的辦法:
List session.createQuery().list() Iterator session.createQuery.iterator() |
從實現機制上,兩者沒什么分別
Find/iterator方法可以根據查詢條件返回符合條件的實體集。如下:
String sql=”from Tuser user where user.age>?”; List ls = session.find(sql,new Integer(14),Hibernate.INTEGER); int len = ls.size(); for(int i=0;i |
String sql=”from Tuser user where user.age>?”; Iterator iterator = session.iterator(sql,new Integer(14),Hibernate.INTEGER); While(iterator.next()) Tuser user = (Tuser)iterator.next(i); System.out.println(“Username: ” + user.getName()); } |
兩者實現了統一的功能,但是大家在執行時看看他們輸出的SQL語句,會發現有很多不同。兩者的執行性能是不一樣的,但是這又與Hibernate提供的緩存機制有很大的關系。
Find方法無法利用利用緩存來提供其執行性能,但iterator可以利用緩存機制來達到提高查詢的性能。另外在內存使用方面,find方法是一次性查詢處所有的結果,如果查詢結果是海量的數據,那么就有可能出現內存溢出。但可以利用iterator和evict方法結合使用來將內存的消耗保持在一個可以接受的范圍:
String sql=”from Tuser user where user.age>?”; Iterator iterator = session.iterator(sql,new Integer(14),Hibernate.INTEGER); While(iterator.next()) Tuser user = (Tuser)iterator.next(i); session.evict(user); //從一級緩存中清除 |
二級緩存可以設置最大的緩存量,達到峰值時自動清除舊緩存數據,但我們這里可以通過編碼指定將對象從二級緩存中清除,有助于保存緩存的有效性
sessionFactory.evict(Tuser.class,user.getID()); System.out.println(“Username: ” + user.getName()); } |
上面的方法只是解決了部分的問題,由于JVM的異步的內存回收機制,無效的對象還會不斷地在內存中積累等待回收。如果數據量較大,會頻繁激發JVM回收,造成性能急劇下降,因此實際開發中,建議采用SQL語句或者存儲過程實現。
【編輯推薦】