查詢效能往往是系統效能表現的乙個重要方面,查詢機制的優劣很大程度上決定了系統的整體效能。這個領域往往也存在最大的效能調整空間。
hibernate2中session.find()對應於3中的session.createquery().list();
hibernate2中session.iterate()對應於3中的session.createquery().iterate();
find和iterate區別:
find方法通過一條select sql實現了查詢操作,而iterate方法要執行多條select sql.
iterate第一次查詢獲取所有符合條件的記錄的id,然後再根據各個id從庫表中讀取對應的記錄,這是乙個典型的n+1次的查詢問題,如果符合條件記錄有10000條,就需要執行10001條select sql,可想效能會如何的差。
那為什麼要提供iterator方法,而不只是提供高效率的find方法?
原因1.與hibernate快取機制密切相關
find方法實際上是無法利用快取的,它對快取只寫不讀。
find方法只執行一次sql查詢,它無法判斷快取中什麼樣的資料是符合條件的,也無法保證查詢結果的完整性。而iterate方法,會首先查詢所有符合條件記錄的id,然後根據id去快取中找,如果快取中有該id,就返回,沒有可以根據id再去資料庫查詢。
string hql = "from tuser where age > ?";
list userlist = session.find(hql, new integer(18), hibernate.integer);
iterator it = session.iterate(hql, new integer(18), hibernate.integer);
順序執行,iterate方法只會執行一次sql查詢,就是查詢id,然後根據id就可以從快取中獲得資料。
string hql = "from tuser where age > ?";
list userlist = session.find(hql, new integer(18), hibernate.integer);
userlist = session.find(hql, new integer(18), hibernate.integer);
快取是不起作用的。
如果目標資料讀取相對較為頻繁,通過iterate這種機制,會減少效能損耗。
原因2.記憶體使用上的考慮
find方法將一次獲得的所有記錄並將其讀入記憶體。如果資料量太大,可能會觸發outofmemoryerror,從而導致系統異常。解決方案之一就是結合iterate方法和evict方法逐條對記錄進行處理,將記憶體消化保持在乙個可以接受的範圍之內。如:
string hql = "from tuser where age > ?";
iterator it = session.iterate(hql, new integer(18), hibernate.integer);
while(it.hasnext())
Hibernate效能優化
hibernate效能優化提高 1.快取 hibernate缺省會用到快取,用得好就能大大提高效能,用得不好就會影響到效率 快取其實就是資料庫資料在記憶體中的乙個臨時容器,將查詢過得資料暫時放在這個容器中,下次如果還是查詢一樣的,就直接在該容器中取得,就不用再去資料庫裡查詢了,這樣間接性的提高了效率...
Hibernate查詢效能優化(多對多關聯查詢)
之前網上購買了一套springmvc hibernate mybatis shiro等常用框架整合的系統原始碼。搭建好環境,跑起來後發現不錯,辦公的基本功能都有。於是就把公司現在oa系統的使用者匯入了新系統。總共也就匯入了1000多條資料,然後發現系統執行的沒那麼流暢了。尤其是使用者管理頁面,分頁查...
hibernate 的效能優化
一級快取 session級別的快取 listusers list session.createquery sql iteratorusers iterator session.createquery sql list 直接資料庫載入user iterator 讀出來的是id 先在session中找 ...