Spring Boot Jpa 緩存


spring boot  jpa 底層實現為hibernate,hibernate的緩存機制分為

 1 . 一級緩存(session緩存)

    2.  二級緩存(id查詢緩存)

 3.   查詢緩存 

導入hibernate相關依賴 ,其中 ehcache為實現二級緩存和查詢緩存需要的緩存框架。

  

項目結構圖如下:

 

hibernate的主配置文件如下:

 1 <?xml version='1.0' encoding='utf-8'?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD//EN"
 4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6     <!-- 通常,一個session-factory節點代表一個數據庫 -->
 7     <session-factory>
 8 
 9         <!-- 1. 數據庫連接配置 -->
10         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
11         <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/shop-db</property>
12         <property name="hibernate.connection.username">root</property>
13         <property name="hibernate.connection.password">123456</property>
14 
15         <!--  數據庫方法配置, hibernate在運行的時候,會根據不同的方言生成符合當前數據庫語法的sql   -->
16         <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
17 
18 
19         <!-- 2. 其他相關配置 -->
20         <!-- 2.1 顯示hibernate在運行時候執行的sql語句 -->
21         <property name="hibernate.show_sql">true</property>
22         <!-- 2.2 格式化sql -->
23         <property name="hibernate.format_sql">true</property>
24         <!-- 2.3 自動建表  -->
25         <property name="hibernate.hbm2ddl.auto">update</property>
26 
27         <!--數據庫連接池的大小-->
28         <property name="hibernate.connection.pool.size">20 </property>
29         <!--字符編碼-->
30         <property name="connection.characterEncoding">utf-8 </property>
31 
32 
33         <!--開啟二級緩存 針對id查詢  -->
34         <property name="hibernate.cache.use_second_level_cache">true</property>
35         <!-- 指定使用哪一個緩存框架 -->
36         <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
37 
38         <!-- 開啟查詢緩存  hibernate的查詢緩存是主要是針對普通屬性結果集的緩存, 而對於實體對象的結果集只緩存id。 -->
39         <property name="hibernate.cache.use_query_cache">true</property>
40 
41 
42 
43 
44         <!--3. 加載所有映射-->
45         <mapping resource="entity/A.hbm.xml"/>
46 
47         <!--緩存實現的是一種方式-->
48 
49         <!--<class-cache class="entity.A" usage="read-write" />-->
50 
51     </session-factory>
52 </hibernate-configuration>

 

主配置文件中需要注意的事項:

  1  mapping 標簽必須位於 property 標簽之后

實體的映射文件:

<?xml version="1.0"?>
<!--頭文件-->
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--這里的package屬性寫的是實體類包-->
<hibernate-mapping package="entity">
    <!--class標簽中的name為實體對應的類名,table標簽為創建的表名,如果不寫默認就是類名首字母小寫(student)-->
    <class name="A">

        <!--二級緩存實現的第二種方式-->
       <cache usage="read-write" region="sample" />
        <!--
            以下所有標簽,name為對應實體中屬性名,column屬性可有可無,有的話表示自己定義在表中的字段名,不寫的話默認與name一致(與實體中的屬性名一致)
        -->
        <!--必須有的主鍵標簽-->
        <id name="id">
            <!--主鍵生成策略,這里表示自增長-->
            <generator class="identity"></generator>
        </id>
        <property name="name"></property>
        <property name="address"></property>
    </class>
</hibernate-mapping>

緩存礦建的配置文件:ehcache.xml

<?xml version="1.0"?>
    <ehcache xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <!--ehcache  在 2.4 版本之后必須添加默認的配置-->
    <defaultCache timeToIdleSeconds="200"
                  maxEntriesLocalHeap="0"
                  eternal="false"/>
    <cache timeToIdleSeconds="200"
           maxEntriesLocalHeap="0"
           eternal="false"
           name="lemonCache"/>
    <cache name="sample"
           maxElementsInMemory="1000"
           eternal="true"
           timeToIdleSeconds="0"
           timeToLiveSeconds="0"
           overflowToDisk="false" />
</ehcache>

驗證一級緩存:(當session不銷毀時,執行相同的查詢操作)

   

驗證結果:發現執行了一次查詢動作

  

 

驗證二級緩存

  1、在主配置文件中,開啟二級緩存,同時指定實現的緩存框架

    <!--開啟二級緩存 針對id查詢  -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <!-- 指定使用哪一個緩存框架 -->
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

  2、增加緩存框架的配置文件:ehcache.xml

 

針對具體需要進行二級緩存的實體,配置緩存策略 ( usage="read-write" )

  實現方式:

  1. 在主配置文件中指定需要二級緩存的實體,緩存的策略 以及具體的緩存方式

    class="entity.A" : 需要緩存的實體

    usage="read-write":緩存讀和更新

    region="sample": 緩存框架中對用的緩存方式

  

  2.在實體的映射文件中進行配置

  

驗證二級緩存:(在二級緩存開啟的情況下,以不同的session去執行同一次查詢,驗證結果)

  

  

驗證查詢緩存,此處記錄和二級緩存同時使用的情況

  1.在主配置文件中開啟查詢緩存

<!-- 開啟查詢緩存  hibernate的查詢緩存是主要是針對普通屬性結果集的緩存, 而對於實體對象的結果集只緩存id。 -->
        <property name="hibernate.cache.use_query_cache">true</property>

  2.在代碼中設置開啟緩存

  驗證結果:

  

 

hibernate緩存機制源碼

 JPA開啟二級緩存

由於jpa的底層實現是hibernate,所以開啟方式類似,具體源碼

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM