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.在代碼中設置開啟緩存

驗證結果:

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