Hibernate獲取數據的方式有不同的幾種其與緩存結合使用的效果也不盡相同而Hibernate中具體 怎麼使用緩存其實是我們很關心的一個問題直接涉及到性能方面
緩存在Hibernate中主要有三個方面一級緩存二級緩存和查詢緩存一級緩存在Hibernate中對應 的即為session范圍的緩存也就是當session關閉時緩存即被清除一級緩存在Hibernate中是不可配置 的部分二級緩存在Hibernate中對應的即為SessionFactory范圍的緩存通常來講SessionFactory的生 命周期和應用的生命周期相同所以可以看成是進程緩存或集群緩存二級緩存在Hibernate中是可以配 置的可以通過classcache配置類粒度級別的緩存(classcache在class中數據發生任何變化的情況下自 動更新)同時也可通過collectioncache配置集合粒度級別的緩存(collectioncache僅在collection中 增加了元素或者刪除了元素的情況下才自動更新也就是當collection中元素發生值的變化的情況下它是 不會自動更新的)緩存自然會帶來並發的訪問問題這個時候相應的就要根據應用來設置緩存所采用的 事務隔離級別和數據庫的事務隔離級別概念基本一樣沒什麼多介紹的^_^查詢緩存在Hibernate同 樣是可配置的默認是關閉的可以通過設置cacheuse_query_cache為true來打開查詢緩存根據緩存 的通常實現策略我們可以來理解Hibernate的這三種緩存緩存的實現通過是通過key/value的Map方式 來實現在Hibernate的一級二級和查詢緩存也同樣如此一級二級緩存使用的key均為po的主鍵ID value即為po實例對象查詢緩存使用的則為查詢的條件查詢的參數查詢的頁數value有兩種情況 如果采用的是select poproperty這樣的方式那麼value為整個結果集如采用的是from這樣的方式那麼 value為獲取的結果集中各po對象的主鍵ID這樣的作用很明顯節省內存^_^
簡單介紹完Hibernate的緩存後再結合Hibernate的獲取數據方式來說明緩存的具體使用方式在 Hibernate中獲取數據常用的方式主要有四種SessionloadSessiongetQuerylist erator
Sessionload
在執行sessionload時Hibernate首先從當前session的一級緩存中獲取id對應的值在獲取不到的 情況下將根據該對象是否配置了二級緩存來做相應的處理如配置了二級緩存則從二級緩存中獲取id 對應的值如仍然獲取不到則還需要根據是否配置了延遲加載來決定如何執行如未配置延遲加載則從數 據庫中直接獲取在從數據庫獲取到數據的情況下Hibernate會相應的填充一級緩存和二級緩存如配 置了延遲加載則直接返回一個代理類只有在觸發代理類的調用時才進行數據庫查詢的操作
在這樣的情況下我們就可以看到在session一直打開的情況下要注意在適當的時候對一級緩存進行 刷新操作通常是在該對象具有單向關聯維護的時候在Hibernate中可以使用象sessionclear sessionevict的方式來強制刷新一級緩存
二級緩存則在數據發生任何變化(新增更新刪除)的情況下都會自動的被更新
Sessionget
在執行Sessionget時和Sessionload不同的就是在當從緩存中獲取不到時直接從數據庫中獲取id 對應的值
Querylist
在執行Querylist時Hibernate的做法是首先檢查是否配置了查詢緩存如配置了則從查詢緩存中查 找key為查詢語句+查詢參數+分頁條件的值如獲取不到則從數據庫中進行獲取從數據庫獲取到後 Hibernate將會相應的填充一級二級和查詢緩存如獲取到的為直接的結果集則直接返回如獲取到 的為一堆id的值則再根據id獲取相應的值(Sessionload)最後形成結果集返回可以看到在這樣的 情況下list也是有可能造成N次的查詢的
查詢緩存在數據發生任何變化的情況下都會被自動的清空
erator
在執行erator時和Querylist的不同的在於從數據庫獲取的處理上erator向數 據庫發起的是select id from這樣的語句也就是它是先獲取符合查詢條件的id之後在進行 iteratornext調用時才再次發起sessionload的調用獲取實際的數據
可見在擁有二級緩存並且查詢參數多變的情況下erator會比Querylist更為高效
這四種獲取數據的方式都各有適用的場合要根據實際情況做相應的決定^_^最好的方式無疑就是 打開show_sql選項看看執行的情況來做分析系統結構上只用保證這種調整是容易實現的就好了在 cache這個方面的調整自然是非常的容易只需要調整配置文件裡的設置而查詢的方式則可對外部進行 屏蔽這樣要根據實際情況調整也非常容易
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27935.html