国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - SSH框架網上商城項目第16戰之Hibernate二級緩存處理首頁熱門顯示

SSH框架網上商城項目第16戰之Hibernate二級緩存處理首頁熱門顯示

2020-05-11 11:25eson_15 JAVA教程

這篇文章主要介紹了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包,先要添加到工程中。如下:

SSH框架網上商城項目第16戰之Hibernate二級緩存處理首頁熱門顯示

然后我們在hibernate.cfg.xml中配置二級緩存相關的配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<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是單例,而且項目啟動時候就會創建)。
具體的查詢策略,我們看下面的這張圖:

SSH框架網上商城項目第16戰之Hibernate二級緩存處理首頁熱門顯示

【注】:圖片文字如果太小,可以把圖片拖到新的窗口看~
以上就是Hibernate的查詢的策略,下面我們來繼續看二級緩存的配置。

3. Hibernate4.3二級緩存高級配置
上面提到了,我們之所以在hibernate.cfg.xml中配置了兩項就可以使用二級緩存,是因為有個默認的配置,下面我們先來看一下這個默認配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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文件,然后在里面對上面這些配置項重新配置即可。我們接下來要測試一下各個配置,在測試之前,我先把首頁顯示的情況貼出來,并編個號,等會測試的時候好說明:

SSH框架網上商城項目第16戰之Hibernate二級緩存處理首頁熱門顯示

以上是首頁顯示的部分內容,Hibernate已經從數據庫中幫我們查出了顯示信息,并且已經顯示好了。我們將它們編個號,等會我們測試緩存的時候就方便分析了。下面我們開始測試一下上面的緩存配置項:
測試一:測試內存中的對象數量。將配置改成下面情況:

?
1
2
3
4
5
6
<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語句,于是測試完畢,二級緩存執行正常。
測試二:測試對象的生命周期。將配置改成下面的情況:

?
1
2
3
4
5
6
7
8
<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啟動也要好幾秒,如果配置少了,還沒測試可能時間已經到了……那就不行了。
測試三:測試二級緩存是否支持硬盤存儲。

?
1
2
3
4
5
6
7
8
<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語句。
測試四:測試二級緩存的替換策略

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<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)的替換策略,因為用戶點擊率高的,肯定要放在二級緩存里。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.伊人网| 成年人免费网站 | 中文字幕国产一区二区 | 久久精品亚洲成在人线av网址 | 欧美日韩中文在线观看 | 91在线区| 国产一区视频在线 | 欧美日韩精品一区二区三区 | 伊人99热 | 九九在线视频 | 国产精品久久久久久久久久久免费看 | 精品影院| 水密桃av| 国产美女网站 | 亚洲精品久久久久久下一站 | 亚洲一一在线 | 欧美日韩精品在线 | 午夜爽爽 | 久久久无码精品亚洲日韩按摩 | 成人羞羞视频免费 | 国产精品美女久久久久aⅴ国产馆 | 99这里只有精品视频 | 久久综合久久88 | 亚洲区欧美区 | 午夜视频免费在线观看 | 麻豆国产尤物av尤物在线观看 | 亚洲国产精品成人精品 | 久久成人免费视频 | 精品少妇一区二区三区在线播放 | 美女视频一区二区三区 | 91免费网站| 亚洲精品在线视频观看 | 国产一区二区黑人欧美xxxx | 波多野结衣中文字幕一区二区三区 | 欧美午夜精品久久久久久浪潮 | 91久久91久久精品免观看 | 91欧美激情一区二区三区成人 | 亚洲在线播放 | 狠狠干很很操 | 久久草在线视频 | 婷婷久久综合 |