淺談HIbernate緩存
淺談HIbernate緩存
緩存的概念
緩存:是計算機領(lǐng)域的概念,它介于應(yīng)用程序和永久性數(shù)據(jù)存儲源之間
緩存:一般人的理解就是在內(nèi)存中的一塊空間,其實也可以將二級緩存配置到硬盤。用白話來說就是一個存儲數(shù)據(jù)的容器。我們關(guān)注的是那些數(shù)據(jù)需要放入二級緩存
緩存的作用:降低應(yīng)用程序直接讀取數(shù)據(jù)庫的頻率。從而提高程序運行性能。緩存中的數(shù)據(jù)就是數(shù)據(jù)存儲源中的數(shù)據(jù)的Copy。緩存的介質(zhì)通常是內(nèi)存

Hibernate一級緩存
Hibernate一級緩存特點
a.使用一級緩存的目的是為了減少對數(shù)據(jù)庫的訪問次數(shù),從而提升hibernate的執(zhí)行效率;(當(dāng)執(zhí)行一次查詢操作的時候,執(zhí)行第二次查詢操作,先檢查緩存中是否有數(shù)據(jù),
如果有數(shù)據(jù)就不查詢數(shù)據(jù)庫,直接從緩存中獲取數(shù)據(jù));
b.Hibernate中的一級緩存,也叫做session的緩存,它可以在session范圍內(nèi)減少數(shù)據(jù)庫的訪問次數(shù),只在session范圍內(nèi)有效,session關(guān)閉,一級緩存失敗;
c.只在session范圍有效,作用時間短,效果不是特別明顯,在短時間內(nèi)多次操作數(shù)據(jù)庫,效果比較明顯。
d.當(dāng)調(diào)用session的save/saveOrUpdate/get/load/list/iterator方法的時候,都會把對象放入session緩存中;
e.一級緩存是默認啟用的,你不能讓他失效
驗證一級緩存的存在
1 Transaction transaction = null; 2 Session session = null; 3 4 5 @Before 6 public void before() { 7 8 session = (Session) SessionFactoryUtil.getCurrentSession(); 9 //開啟事務(wù) 10 transaction = session.beginTransaction(); 11 } 12 13 @Test 14 public void testCache1() { 15 Dept dept = (Dept) session.get(Dept.class, 1); 16 System.out.println("=============緩存分界線============="); 17 System.out.println("查詢一樣的數(shù)據(jù)"); 18 Dept dept2 = (Dept) session.get(Dept.class, 1); 19 System.out.println("==================================="); 20 System.out.println("查詢不一樣的數(shù)據(jù)"); 21 Dept dept3 = (Dept) session.get(Dept.class, 2); 22 } 23 24 25 @After 26 public void close() { 27 //提交食物 28 transaction.commit(); 29 }
查詢結(jié)果

可以看見第二次執(zhí)行一樣的查詢語句是并沒有生產(chǎn)新的SQL語句。這是因為第一次執(zhí)行時會先去一級緩存中找數(shù)據(jù)如果沒有的話在和數(shù)據(jù)庫交互。然后把在數(shù)據(jù)庫查詢的結(jié)果放入到
一級緩存之中第二次在查詢一樣的數(shù)據(jù)時當(dāng)走到一級緩存的時候直接使用不用在和數(shù)據(jù)交互。
執(zhí)行原理圖

HIbernate二級緩存
HIbernate二級緩存概念
我們知道一級緩存,并且一級緩存的作用范圍就在session中,每個session都有一個自己的一級緩存,而二級緩存也就是比一級緩存的作用范圍更廣,存儲的內(nèi)容更多,我們知道session是由sesssionFactory創(chuàng)建出來的,一個sessionFactory能夠創(chuàng)建很多個session,每個session有自己的緩存,稱為一級緩存,而sessionFactory也有自己的緩存,存放的內(nèi)容供所有session共享,也就是二級緩存。
圖解

Hibernate二級緩存配置
Hibernate二級緩存不同于一級緩存需要我們手動配置
1.pom文件引入需要的jar
<!--配置需要的ehcahe插件-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>3.6.10.Final</version>
</dependency>
2.在cfg.xml文件配置相關(guān)節(jié)點
<!--開啟hibernate需要的2級緩存-->
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
3.引入需要的緩存配置文件(resources文件夾下)
<ehcache>
<!-- 默認的臨時文件-->
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
1.在hibernarte.cfg.xml中加入兩個<property>
2.1 hibernate.cache.use_second_level_cache true
<property name="hibernate.cache.use_second_level_cache">true</property>
2.配置二級緩存的供應(yīng)商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
3.設(shè)置你要緩存的類以及他的策略
<class-cache class="cn.happy.entity.Dept" usage="read-write"></class-cache>、
4.在resource目錄下添加一個文件 ehcache.xml文件
驗證HIbernate二級緩存的存在
@Test public void testCache2() { System.out.println("===========前=========="); Dept dept = (Dept) session.get(Dept.class, 1); session.close(); System.out.println("===========后========="); session = (Session) SessionFactoryUtil.getCurrentSession(); //開啟事務(wù) transaction = session.beginTransaction(); dept = (Dept) session.get(Dept.class, 1); System.out.println(dept); }
執(zhí)行結(jié)果

HIbernate二級緩存執(zhí)行原理
首先,當(dāng)我們使用Hibernate從數(shù)據(jù)庫中查詢出數(shù)據(jù),獲取檢索的數(shù)據(jù)后,Hibernate將檢索出來的對象的OID放入緩存中key 中,然后將具體的POJO放入value中,
等待下一次再次向數(shù)據(jù)查詢數(shù)據(jù)時,Hibernate根據(jù)你提供的OID先檢索一級緩存,若有且配置了二級緩存,則檢索二級緩存,如果還沒有則才向數(shù)據(jù)庫發(fā)送SQL語句,然后將查詢出來的對象放入緩存中。