SSH框架網上商城項目第16戰之Hibernate二級緩存處置首頁熱點顯示。本站提示廣大學習愛好者:(SSH框架網上商城項目第16戰之Hibernate二級緩存處置首頁熱點顯示)文章只能為提供參考,不一定能成為您想要的結果。以下是SSH框架網上商城項目第16戰之Hibernate二級緩存處置首頁熱點顯示正文
網上商城首頁都有熱點商品,那末這些商品的點擊率是很高的,當用戶點擊某個熱點商品後須要進入商品的具體信息頁面,就像淘寶外面那樣。那末每次點擊都要去後台查詢一下該商品的具體信息,就會發送響應的sql語句,每次刷新一下具體頁面也會發sql語句,如許的話,機能確定會遭到很年夜的影響。那末應用Hibernate的二級緩存便可以處理這個成績。
有些人能夠會想,我們可使用重定向,如許的話,在用戶第一次拜訪的時刻把信息查出來放到session中,今後每次用戶刷新便可以去session中拿了,如許就不消去數據庫中查詢了,這是有事理的,然則不克不及處理下面的成績,由於我們要處理的是多用戶去拜訪統一商品,去點擊統一商品,重定向只能包管統一用戶去點擊或刷新。然則二級緩存可以處理這些成績。
我們先具體講解一下基於Hibernate4.3的二級緩存技巧,然後再針對本項目做一個詳細的設置裝備擺設。
1. Hibernate4.3二級緩存根本設置裝備擺設
與Hibernate3分歧,Hibernate4.3的焦點包裡沒有跟緩存相干的類,我們要用二級緩存的話,須要加上緩存的jar包,從官方下載的hibernate-release-4.3.11.Final中的lib/optional/ehcache中有二級緩存所須要的jar包,先要添加到工程中。以下:
然後我們在hibernate.cfg.xml中設置裝備擺設二級緩存相干的設置裝備擺設:
<hibernate-configuration> <session-factory> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="show_sql">true</property> <!-- 設置裝備擺設二級緩存供給商,留意此處其實不是緩存的jar包 --> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> <mapping class="cn.it.shop.model.Category" /> <mapping class="cn.it.shop.model.Account" /> <mapping class="cn.it.shop.model.Product" /> <!-- 設置裝備擺設哪些類支撐緩存,這裡重要是顯示首頁的熱點商品,所以Product類支撐緩存 --> <class-cache usage="read-only" class="cn.it.shop.model.Product"/> </session-factory> </hibernate-configuration>
然後我們開啟tomcat辦事器,然後拜訪首頁,點擊熱點商品,後台就沒有再發送sql語句了,年夜家能夠會疑惑,豈非二級緩存就這麼簡略?設置裝備擺設下面這兩個項就弄定了?其實到如今為止,二級緩存曾經失效的緣由是它有個默許的設置裝備擺設,在下面誰人ehcache-core-2.4.3.jar中有個ehcache-failsafe.xml文件,外面曾經有了默許設置裝備擺設,我們等會再詳細剖析。我們先來剖析一下Hibernate的查詢戰略:
2. Hibernate4.3的查詢戰略
Hibernate支撐兩種查詢方法:session查詢和hql查詢。
session中有session.save() update() delete() get() load()等辦法,此方法僅僅操作一筆記錄,默許不消任何設置裝備擺設就支撐二級緩存。是以:read-only設置裝備擺設對session是失效的。在session中假如二級緩存中設置裝備擺設了read-only,則session.update()和delete()操作都邑掉敗,假如想要勝利,則須要設置裝備擺設成read-write。然則save()和get() load()是勝利的。
hql:此方法默許是用來操作多筆記錄,好比list()和executeUpdate() 辦法。此方法默許二級緩存的設置裝備擺設包含read-only是有效的。hql的list()查詢的是多筆記錄,直接查詢數據庫,並將查詢的成果交給二級緩存,便於get()和load()的挪用。executeUpdate也是不支撐二級緩存的,也是直接到數據庫更新,Hibernate會包管數據庫與緩存同步。留意:hql是沒有save()辦法的,假如須要拔出數據只能挪用session.save()辦法。
【注】:Hibernate中的一級緩存(默許存在)也稱為session級別緩存,不是用來晉升機能,而是用來處置事務的;二級緩存為sessionFactory緩存,對一切session都有用,性命周期與sessionFactory雷同(sessionFactory是單例,並且項目啟動時刻就會創立)。
詳細的查詢戰略,我們看上面的這張圖:
【注】:圖片文字假如太小,可以把圖片拖到新的窗口看~
以上就是Hibernate的查詢的戰略,上面我們來持續看二級緩存的設置裝備擺設。
3. Hibernate4.3二級緩存高等設置裝備擺設
下面提到了,我們之所以在hibernate.cfg.xml中設置裝備擺設了兩項便可以應用二級緩存,是由於有個默許的設置裝備擺設,上面我們先來看一下這個默許設置裝備擺設:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <!-- 假如緩存內存溢出,則存儲到硬盤空間 --> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" : <!-- 內存支撐的最年夜對象的數目 --> eternal="false" :<!-- 對象能否永遠失效,建議為false,如許上面的兩個參數才會有用 --> timeToIdleSeconds="60" :<!-- 對象的距離周期,默許單元為秒。即60秒後假如還沒人用這個對象,會提早燒毀 --> timeToLiveSeconds="120" :<!-- 對象的性命周期,默許單元為秒 --> overflowToDisk="true" :<!-- 能否支撐溢出到硬盤,建議為true --> maxElementsOnDisk="10000000" :<!-- 硬盤上支撐的最年夜對象的數目 --> memoryStoreEvictionPolicy="LRU" :<!-- 對象的調換戰略 --> /> </ehcache>
關於默許設置裝備擺設的相干說明曾經在下面的正文中了,我們如今曉得了,正由於這個默許的設置裝備擺設,才使得Hibernate4.3的二級緩存得以准確履行。如今假如我們要本身停止緩存的設置裝備擺設,就須要本身在src目次下新建一個ehcache.xml文件,然後在外面對下面這些設置裝備擺設項從新設置裝備擺設便可。我們接上去要測試一下各個設置裝備擺設,在測試之前,我先把首頁顯示的情形貼出來,並編個號,等會測試的時刻好解釋:
以上是首頁顯示的部門內容,Hibernate曾經從數據庫中幫我們查出了顯示信息,而且曾經顯示好了。我們將它們編個號,等會我們測試緩存的時刻就便利剖析了。上面我們開端測試一下下面的緩存設置裝備擺設項:
測試一:測試內存中的對象數目。將設置裝備擺設改成上面情形:
<defaultCache maxElementsInMemory="6" <!-- 設置只支撐緩存6個 --> eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="FIFO" :<!-- 先輩先出 --> />
設置裝備擺設好後,我們重啟一下辦事器,翻開首頁,因為設置裝備擺設的是6個,所以緩存中只存了最初查出來的6筆記錄,也就是編號3-8,我們點擊3-8中的任何一個商品進入商品具體頁面,留意看後台的掌握台沒有輸入任何查詢信息,解釋並沒有發sql語句,然則當我們點擊編號2的商品時,後台發了一條sql語句,即查詢了數據庫,我們撤退退卻再次點擊2商品,就沒有再發sql語句了,解釋曾經放到緩存裡了,然則緩存只支撐6條數據,由於設置裝備擺設的對象調換戰略是先輩先出,所以方才緩存中的編號3被移除,我們點擊一下3嘗嘗,發了一條sql語句,因而測試終了,二級緩存履行正常。
測試二:測試對象的性命周期。將設置裝備擺設改成上面的情形:
<defaultCache maxElementsInMemory="100" eternal="false" <!-- 配成false能力設置上面的性命周期 --> timeToIdleSeconds="20" timeToLiveSeconds="40" overflowToDisk="false" memoryStoreEvictionPolicy="FIFO" />
下面設置裝備擺設了緩存的時光為40秒,假如20秒沒有操作就移除。因為我們配了100筆記錄,所以下面編號1-8都在緩存裡,我們開啟辦事器後,隨意點擊一個,好比點擊編號8,沒有收回sql語句,正常,20秒後,再點擊編號8,發了一條sql語句,解釋我們設置裝備擺設的性命周期失效了。這裡要留意一下,不克不及設置裝備擺設太短,好比設置裝備擺設10秒,由於tomcat啟動也要好幾秒,假如設置裝備擺設少了,還沒測試能夠時光曾經到了……那就不可了。
測試三:測試二級緩存能否支撐硬盤存儲。
<defaultCache maxElementsInMemory="4" eternal="false" <!-- 配成false能力設置上面的性命周期 --> timeToIdleSeconds="100" timeToLiveSeconds="200" overflowToDisk="true" <!-- 設置裝備擺設成true才支撐硬盤存儲 --> memoryStoreEvictionPolicy="FIFO" />
我們將支撐硬盤存儲設置成了true,並將二級緩存最年夜存儲量設置裝備擺設成了4。重啟辦事器,由於二級緩存最多存4筆記錄,所以確定是編號5-8,點擊5-8確定不會發sql語句,然則當我們點擊1-4時,也不會發sql語句,由於我們設置了支撐硬盤存儲,Hibernate將查詢成果存在硬盤上了,所以我們也能夠直接拿到數據,不須要發sql語句。
測試四:測試二級緩存的調換戰略
<defaultCache <!-- FIFO曾經镌汰了,不會再用了…… LRU:比來起碼被拜訪算法(時光戰略),會疏忽拜訪頻率,離如今最遠時光拜訪的會被調換失落 LFU:比來最未應用算法(頻率丈量),會疏忽拜訪的前後時光,拜訪頻率起碼的會被調換失落 --> maxElementsInMemory="3" eternal="false" <!-- 配成false能力設置上面的性命周期 --> timeToIdleSeconds="100" timeToLiveSeconds="200" overflowToDisk="false" <!-- 設置裝備擺設成true才支撐硬盤存儲 --> memoryStoreEvictionPolicy="LFU" />
望文生義,LRU和LFU分離是存眷最初拜訪時光和拜訪頻率的,我們拿LFU來舉例子,如今我們設置了最年夜存儲為3筆記錄,也就是編號6-8,如今我們順次拜訪編號6三次,編號7兩次,編號8一次,都不會發sql語句,我們再拜訪編號7,發了sql語句,如今編號7存在了緩存裡,編號8曾經被移除,由於它拜訪的次數起碼,我們可以再次點擊編號8測試一下,收回了sql語句,測試勝利。假如是LRU,則方才移除的是編號6,由於編號6最早拜訪的。
到這裡,信任年夜家對二級緩存的應用曾經控制了,二級緩存的測試就到這裡。上面針對我們這個網上商城的項目做一下設置裝備擺設。
4. 網上商城項目標現實設置裝備擺設
我們設置裝備擺設二級緩存的最年夜記載數為1000,設置性命周期為120秒,距離周期為60秒,支撐硬盤存儲,而且應用頻率優先(LFU)的調換戰略,由於用戶點擊率高的,確定要放在二級緩存裡。
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <!-- 假如緩存內存溢出,則存儲到硬盤空間 --> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="60" timeToLiveSeconds="120" overflowToDisk="true" memoryStoreEvictionPolicy="LFU" /> </ehcache>
好了,聯合網上商城這個項目,Hibernate4.3的二級緩存設置裝備擺設及應用就引見完了。
原文地址:http://blog.csdn.net/eson_15/article/details/51405911
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。