Mybatis缓存
MyBatis中的缓存相关类都在cache包下面,而且定义了一个顶级接口Cache,默认只有一个实现类PerpetualCache,PerpetualCache中是内部维护了一个HashMap来实现缓存。即Mybatis缓存的底层是通过HashMap来实现的
一级缓存
1.Mybatis的一级缓存是sqlSession级别的,即通过同一个sqlSession查询的数据会被缓存,再次使用同一个sqlSession查询同一条数据会从缓存中来获取
2.Mybatis的一级缓存默认是开启的
一级缓存失效的四种情况
a.不同的sqlSession对应不同的一级缓存
b.同一个sqlSession但是查询条件不同
Book book1=sqlSession.getMapper(BookMapper.class);
book1.getById(1);
Book book2=sqlSession.getMapper(BookMapper.class);
book2.getById(2);
c.同一个sqlSession两次查询期间执行了任何一次的增删改操作
因为做增删改操作,会自动清空缓存
d.同一个sqlSession两次查询期间手动清空了缓存
//通过clearCache()方法来清空缓存
sqlSession.clearCache();
二级缓存
1.Mybatis的二级缓存是SqlSessionFactory级别的,通过同一个SqlSessionFactory创建的SqlSession查询相同数据的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取。
2.开启二级缓存:
2.1 通过在mybatis的核心配置文件中,设置全局配置属性cacheEnabled="true"1这个不配置也行,因为默认就是true。
2.2 在Mapper映射文件内需要配置缓存标签:< cache/>
2.3 二级缓存必须在sqlSession关闭或者提交后才生效
//关闭
sqlSession.close();
//提交
sqlSession.commit();
2.4 查询的数据所转换的实体类pojo必须要实现序列化的接口
3.二级缓存失效
如果两次查询之间执行了任意的增删改操作,会使一级和二级缓存同时失效
Mybatis缓存查询的顺序
先查询二级缓存,因为二级缓存可能会有其他程序已经查出来的数据,可以直接拿来使用
如果二级缓存没有命中,再查询一级缓存
如果一级缓存没有命中,则查询数据库
SqlSession关闭之后,一级缓存中的数据会写入二级缓存
整合第三方缓存EHCache(针对于二级缓存)
因为mybatis的二级缓存是可以使用第三方缓存的
EHCache
Ehcache是一种广泛使用的Java分布式缓存器,具有快速、精干等特点,是Hibernate中默认CacheProvider。它提供内存存储和磁盘存储两种方案,因此无需担心容量问题。Ehcache可以单独使用,一般在第三方库中被用到的比较多,如Hibernate、MyBatis等
因为Ehcache直接在JVM虚拟机中缓存,速度快,效率高,但是缓存共享十分麻烦,集群分布式应用不方便。Ehcache是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便。虽然Ehcache号称“分布式缓存器”,实际来看,口宣能力大于实际能力,当然,从商业角度来说,这也无可厚非。
整合EHCache
1.在pom.xml文件中导入依赖
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.2</version>
</dependency>
2.在src/main/resources/创建一个配置文件 ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<!-- 磁盘缓存位置 -->
<diskStore path="F:\java_learn\ehcache"/>
<!-- 默认缓存 -->
<defaultCache
maxEntriesLocalHeap="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<!—自定义缓存:MyCache -->
<cache name="MyCache"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="5"
timeToLiveSeconds="5"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>
3.在SQL映射文件中添加
//开启二级缓存
<cache />
//整合第三方缓存
<cache type="org.mybatis.caches.ehcache.EhcacheCache">