首先我們要明白什麼是緩衝,緩衝是指臨時檔案交換區。臨時就說明了他不是永久性的。緩衝是介於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上資料的訪問的時候有伺服器有兩種緩衝方式,一種是分布緩衝和中央緩衝的方式。分布式擷取資料快但是修改資料的時候成本高,另一種相反,所以視情況而定。