hibernate的緩衝你知道多少

來源:互聯網
上載者:User

      首先我們要明白什麼是緩衝,緩衝是指臨時檔案交換區。臨時就說明了他不是永久性的。緩衝是介於cpu和主存之間的裝置。他的讀寫速度比主存快,比cpu慢。緩衝有一個叫命中率的概念。這個也很好理解。Cpu是處理資料和運算資料的地方,資料的讀取要不來自記憶體,要不來自緩衝。但是緩衝介於主存和記憶體之間。所以如果cpu能直接從緩衝中拿資料。那麼他執行的效率一定會提高。如果緩衝中沒有再去主存中那資料。那麼你也就可以知道,命中率=緩衝訪問的次數/(緩衝訪問的次數+主存的訪問次數)。

     所以hibernate引入緩衝。你就知道為什麼了。就是為了提高效率的。要知道每次對資料的訪問都是很消耗資源的,而且資料庫是外部的,所以時間執行會慢。試想有些資料你要從資料庫裡面查詢(這個結果很大),查詢第一遍。接著又要查詢第二遍。如果沒有緩衝這就意味著你要訪問兩次資料庫。但是查詢的結果只有一兩條更新,或者壓根沒有更新。所以如果這時候如果有緩衝的話,你可以將第一次結果放在緩衝中。那麼第二次查詢你可以從緩衝中取資料,如果沒有再去訪問資料庫,這就大大提高了效率。所以使用緩衝這裡有四個前提,第一:對資料的精確性不是很高,也就是說你允許有資料誤差。第二:修改次數小於讀寫的次數(快取命中率要高),試想如果你第一次和第二次的查詢,結果根本就不一樣,

首先去緩衝找沒找到,然後去資料庫中找。這樣還不如不要緩衝直接上資料庫找。第三:資料要有獨享控制,如果你這邊在讀寫那邊這修改這樣的資料基本就是廢的。第四:資料的容量小於記憶體容量,這是硬傷,否則會記憶體溢出、

       那麼hibernate的緩衝個人認為是變相的map,事實上他也是個map。首先如何?緩衝,使用者第一次查詢資料,在換回結果的同時也把結果放到map裡面一份。要知道map是一個索引值對的集合,這裡的key就是你的hql語句,value就是你的封裝有用的資訊。那麼第二次查詢hql語句相同的情況下,hibernate就會自己先去map裡面找,如果沒有就去資料庫裡面找。而且本人對集合的理解就是集合是可以執行增刪改查的容器。所以我們對map的移除的過程就是在清理緩衝的過程。當然hibernate的緩衝遠沒有一個map這麼簡單,比如說緩衝的有效時間之類的事情要解決。

       在hibernate中緩衝緩衝分為一級緩衝和二級緩衝。一級緩衝是session級的共用,主要這些可以操作有save,update,saveOrUpdate,load,get,list,iterate,lock,evick,clear,contains,flush。但是一級緩衝作用範圍小,所以hibernate有2級緩衝。一般hibernate現在1級緩衝中找如果找不到就去2級緩衝中找。二級緩衝,sessionFactory級的共用,首先hibernate在設定檔中要啟用2級緩衝的配置。

 

hibernate.cfg.xml 

 

<hibernate-configuration>

    <session-factory>

       <!-- 設定二級快取區外掛程式EHCache的Provider類-->

       <propertyname="hibernate.cache.provider_class">

          org.hibernate.cache.EhCacheProvider

       </property>

       <!-- 啟動"查詢快取" -->

       <propertyname="hibernate.cache.use_query_cache">

          true

       </property>

    </session-factory>

  </hibernate-configuration>

 

 

ehcache.xml 

 

<ehcache>

 <!-- maxElementsInMemory為緩衝對象的最大數目, eternal設定是否永遠不到期,timeToIdleSeconds對象處於空閑狀態的最多秒數,timeToLiveSeconds對象處於緩衝狀態的最多秒數
-->

  <diskStorepath="java.io.tmpdir"/>

    <defaultCache maxElementsInMemory="10000"eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"overflowToDisk="true"/>

</ehcache>

 

 

 

****.hbm.xml 

 

<?xmlversion="1.0" encoding='UTF-8'?>

<!DOCTYPE hibernate-mappingPUBLIC

                            "-//Hibernate/HibernateMapping DTD 3.0//EN"

                           "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

 

<hibernate-mapping>

    

   <class>

       <!-- 設定該持久化類的二級緩衝並發存取原則 read-only read-write nonstrict-read-writetransactional-->

       <cacheusage="read-write"/>   

   </class>

 

</hibernate-mapping>

 

 

 

還有客戶實現web上資料的訪問的時候有伺服器有兩種緩衝方式,一種是分布緩衝和中央緩衝的方式。分布式擷取資料快但是修改資料的時候成本高,另一種相反,所以視情況而定。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.