hibernate緩存與查詢

今天內容:
1.Hibernate緩存
   1.1 什麼是緩存?
        緩存介於應用程序和物理數據源之間。
緩存是數據源數據的複製,應用程序運行過程中每次都是從緩存中讀取數據,在特定的時間或者事件會同步緩存和物理數據源的信息。

1.2 爲什麼要用緩存?
            從web程序和服務器角度出發,降低應用訪問服務器的次數,降低了服務器壓力。
web程序從本地緩存讀取數據速率更快,程序流暢度更高,用戶體驗度更好。      
   1.3  Hibernate的緩存
         針對的是持久化層,存儲的是數據庫數據的備份。
   1.4 Hibernate的緩存方式(2種)
        第一種:一級緩存(內置緩存,無法卸載的):  Session級別  :Session的緩存隨着Session的消失而消失了。
      Session被關閉的情況下所有的Session緩存被清楚。 close()
/**
* Hibernate的一級緩存:Session級別的

* 第一次查詢執行select語句,把查詢的結果存儲到session一級緩存中。
* 在同一次session中再次查詢,不會再次發起sql語句,後續的查詢結果會從session緩存中查找。

* session.evict(card1);//表示從session一級緩存中移除指定的對象,但是不會同步到數據庫中
* session.clear();//表示移除session中所有裝載的緩存對象和掛起的操作(saves,updates,deletes..)


* evict()和clear()把持久化的對象轉化成了遊離狀態(託管狀態)
*/
/**
* 快照:把set暫時存儲起來了。
* 緩存:把set操作先存儲緩存.

* 快照是緩存的備份。

* 1.Card card1 = session.get(Card.class, 1);查詢把結果存儲到緩存中
* 2.card1.setCardNum("11111111111111111111"); 把該操作的內容存儲在緩存中,同時在快照中也存儲一份
* 3.card1.setCardNum("2222222222222222"); 
*    把該操作的內容存儲在緩存中,更新前先必須和以前的快照進行比對,
*      如果一致,直接持久化更新。
*      如果不一致,需要更新快照的數據,再去持久化。
*      
*  快照目的:   防止多次重複提交,重複發送sql語句 
*      
*/

        第二種:二級緩存(Hibernatem沒有做處理,需要添加額外的包完成,常用Ehcache):  SessionFacotry級別 
          適用的情況:很少被修改或者是不是很重要的數據或者是偶爾出現併發問題的數據

        實現二級緩存的步驟:
 1.添加二級緩存包(hibernate下載庫lib/optional/ehcache(3個))
 2.在hibernate.cfg.xml進行配置支持二級緩存(3個) hibernate下載庫/project/etc/hibernate.properties中找到
       <!-- 配置二級緩存 -->
<!-- 開啓二級緩存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 查詢二級緩存 -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- 指定二級緩存方式 -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.internal.EhCacheRegionFactory</property>
                  3.配置二級緩存的配置文件ehcache.xml文件(hibernate下載庫/project/etc/ehcache.xml)
 <!-- 配置二級磁盤緩存目錄 -->
 <diskStore path="C:\cache"/>
<!--每一個實體類要緩存都是一個cache單元
  name:要緩存的類名(包名+類名)
  maxElementsInMemory:在內存中存放的最大對象的個數
  eternal:是否永久保存
  timeToIdleSeconds:緩存創建以後,最後一次訪問的時間到失效的時間間隔
  timeToLiveSeconds:緩存創建以後到失效的時間
  overflowToDisk:超過內存存放對象的最大個數後,問超過的是否要存儲在磁盤上
-->
<cache name="com.sky.pojo.Card"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
                   4.配置緩存策略(4個):
           read-only:對於從來不修改的數據採用該策略   serizalible 
  read-write:對經常讀但是很少修改的數據採用該策略  read committed      
  notstrict-read-write:對於極少被修改但是允許髒讀的數據使用該策略。不保證數據庫和緩存之間的一致性。
                       類似於read uncommitted
  transaction:僅僅用於受管理的壞境中使用。對經常讀但是很少修改的數據,但是防止髒讀和不可重複讀數據。
              類似於  mysql默認級別 重複讀repeatable read級別 
配置位置:寫在要緩存的實體類的映射文件的class下。
                      <cache usage="read-only"/>

                  5.測試:  

* 二級緩存:SessionFactory級別,添加額外包配置的
* Session一級緩存(內存緩存)
* SesssionFactory二級緩存(磁盤緩存) 

* 如果所有緩存都存在,先去一級緩存(重要數據),再去二級緩存(不常修改或者是不重要的數據)查找

* 一級緩存:相對來說安全。  讀取速度快(內存和磁盤讀取速度)

2.Hibernate的4種查詢方式  Query
    情況一:嚴格意義:5種方式
   1.oid方式:  get(T.class,id)/load(T.class,id)
   2.對象導航檢索模式: User對象嵌套Address
    3.原生SQL語句查詢:
    4.Hibernate查詢語言(HQL):
    5.Criteria查詢(QBC:Query  by  Criteria)

    情況二:一般情況: 3種
            1.原生SQL語句查詢:
      1.1 基礎查詢:
       1.2 條件查詢(舉例1個):
       1.3 分頁查詢:
             2.Hibernate查詢語言(HQL):
       3.Criteria查詢(QBC:Query  by  Criteria)
   













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章