缓存介绍:
就是将用户经常查询的数据的结果的一个保存,保存到一个内存中,用户在查询的时候就不用到数据库文件中查询,从而减少与数据库的交付次数提高了响应速度,解决了并发系统的性能问题。
MyBatis提供了一级缓存和二级缓存:
-
一级缓存:
也称为本地缓存,用于保存用户在一次会话过程中查询的结果,用户一次会话中只能使用一个sqlSession,一级缓存是自动开启的,不允许关闭。如果执行多次查询条件完全相同的SQL,会优先命中一级缓存,避免直接对数据库中直接查询。
一级缓存失效的原因:
- 当查询的结果不一样时会失效
- 执行增删改的时候,数据发生变化,就要刷新缓存,也会失效
- 手动设置sqlSession.clearCache()也同样会失效
-
二级缓存:
也称为全局缓存,是mapper级别的缓存,是针对一个表的查结果的存储,可以共享给所有针对这张表的查询的用户。也就是说对于mapper级别的缓存不同的sqlsession是可以共享的。开启二级缓存后,如果一级缓存的SqlSession关闭,那么一级缓存就没有了,一级缓存中的数据就会存入二级缓存中
怎么开启二级缓存:
- 在Mybaties的配置文件中添加settings标签,属性写cacheEnabled,cacheEnabled的默认值是true
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
2.然后在对应的Mapper下面添加<cache/>标签
3.cache标签的一些属性(可以不用写):
eviction: 定义回收的策略,常见的有FIFO,LRU。
flushInterval: 配置一定时间自动刷新缓存,单位是毫秒。
size: 最多缓存对象的个数。
readOnly: 是否只读,若配置可读写,则需要对应的实体类能够序列化。
自定义缓存之Ehcacheh的使用:
- 1.导入ehcache的Jar
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.4</version>
</dependency>
- 2.百度找一个ehcache的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxEntriesLocalHeap="1000"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="3000"
diskSpoolBufferSizeMB="30"
maxEntriesLocalDisk="10000"
diskExpiryThreadIntervalSeconds="1200"
memoryStoreEvictionPolicy="LRU"
statistics="false">
<persistence strategy="localTempSwap"/>
</defaultCache>
<cache name="harryBootCache"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="3000"
maxElementsInMemory="1000"
memoryStoreEvictionPolicy="FIFO"/>
</ehcache>
- 3.在对应的Mapper下面设置ehcache的实现
<cache type="net.sf.ehcache.Ehcache"/>