一、缓存定义:
- 将用户经常查询的数据放在 缓存(内存) 中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
- mybatis提供查询缓存,用于减轻数据库压力,提高数据库性能:
- 一级缓存:将查询到的数据存储到SqlSession中。
- 二级缓存:将查询到的数据存储到SqlSessionFactory中。
- 或者集成其它第三方的缓存:比如EhCache【Java语言开发的】、Memcache【C语言开发的】等。
二、缓存执行机制:
- 在进行数据库访问时,首先去访问缓存,如果缓存中有要访问的数据,则直接返回客户端,如果没有则去访问数据库,在库中得到数据后,先在缓存放一份,再返回客户端。
- mybaits提供一级缓存和二级缓存。默认开启一级缓存。
- 一级缓存优先级高于二级缓存。

三、一级缓存:
- 一级缓存使用的是SqlSession的作用域,同一个sqlSession对象共享一级缓存的数据。(只要使用同一个SqlSession对象执行同一条SQL语句,就会走缓存)
- 如果sqlSession执行commit操作(执行插入、更新、删除),则清空SqlSession一级缓存中的所有缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
sqlSession.clearCache();手动清空一级缓存。
- 二级缓存使用的是mapper的作用域,不同的sqlSession只要访问的同一个mapper.xml文件,则共享二级缓存作用域。
- SqlSession对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中。此时二级缓存才可用。
- 如果两次查询之间出现了增删改操作,且SqlSession对象关闭或提交,二级缓存就会失效。
- 二级缓存需要手动开启:SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存,并且要让实体类实现serializable接口,具体如下:
(1)SqlMapConfig.xml中加入设置:

(2)Mapper.xml文件中二启二级缓存,使用:

(3)实体类必须实现java.io.serializable接口,保证实体可序列化:

- 集成EhCache是为了代替Mybatis自带的二级缓存。一级缓存是无法替代的。
- Mybatis对外提供了接口,用于集成第三方缓存组件(开源)。
pom.xml文件添加依赖:
<dependency>
<groupId>org.mybatis.cachesgroupId>
<artifactId>mybatis-ehcacheartifactId>
<version>1.2.2version>
dependency>
类路径下新建echcache.xml文件:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStore path="e:/ehcache"/>
<defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>
ehcache>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
修改Mapper.xml文件的标签:
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>