1.缓存概念:
缓存是计算机领域非常通用的概念。它介于应用程序和永久性数据存储数据源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能,缓存中的数据是数据存储源中数据的拷贝,应用程序在运行时直接读写缓存中的数据,只在某些特定时刻按照缓存中的数据来同步更新数据存储源。 缓存的物理介质通常是内存,而永久性数据存储源的物理介质通常是硬盘或磁盘,应用程序读写内在的速度显然比读写硬盘的速度快,如果缓存中存放的数据量非常大也会用硬盘作为缓存的物理介质。缓存的实现不仅需要作为物理介质的硬件,同时还需要用于管理缓存的并发访问和过期等策略的软件。
因此缓存是通过软件和硬件共同实现的
2.缓存作用:
是用来减少访问数据源(数据库)次数
3.缓存分类:
- 一级缓存:事务
- 二级缓存:进程
- 三级缓存:集群
MyBatis支持1级缓存和2级缓存,在实际开发中,实际上很少使用到MyBatis自带的缓存,大部分情况下,缓存都是使用EHCache,MemoryCache、Redis等等来实现缓存。
4.MyBtis中的一级缓存:
MyBatis中1级缓存是基于SqlSession的
@Test
public void query2() throws IOException {
SqlSession session = DbUtils.getInstace().openSession();
//通过Java动态代理自动提供了UserMapper的实现类
EmpMapper mapper = session.getMapper(EmpMapper.class);
// 第一次查询,从数据库中查询的数据会保存在一级缓存中
// key:
List<Emp> list = mapper.query();
for (Emp emp : list) {
System.out.println(emp.getId()+","+emp.getName());
}
System.out.println("----------");
// 先查看缓存中是否有该数据,如果没有就从数据库中查询
Emp emp = mapper.queryById(1);
System.out.println(emp.getId()+","+emp.getName());
System.out.println("----------");
// 之前查询的有,直接从缓存中获取
emp = mapper.queryById(1);
System.out.println(emp.getId()+","+emp.getName());
session.close();
}
跟踪源码发现,缓存的key是由id 属性及sql语句组成的,所以第一个查询和第二个查询不同,没有使用缓存。、
5.MyBtis中的二级缓存:
二级缓存基于SqlSessionFactory,一级缓存的作用域只是SqlSession,范围比较下,用到的不多。二级缓存是进程基本的缓存,用的比较普遍,二级缓存MyBatis本身没有提供,常用的主键有Ehcache和Redis,本文主要讲解Ehcache
5.1 使用步骤
①导包
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.1.0</version>
</dependency>
②开启二级缓存
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>