------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
二级缓存
Mybatis中,默认二级缓存是开启的。可以关闭。
一级缓存开启的。可以被卸载吗?不可以的。一级缓存不可以卸载,天然和框架绑定。
内置二级缓存
由于MyBatis从缓存中读取数据的依据与SQL的id相关,而非查询出的对象。所以,使用二级缓存的目的,不是在多个查询间共享查询结果(所有查询中只要查询结果中存在该对象,
就直接从缓存中读取,这是对查询结果的共享,Hibernate中的缓存就是为了在多个查询间共享查询结果,但MyBatis不是),而是为了防止同一查询(相同的Sql id,相同的sql语句)的反复执行。
一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其生命周期为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache
对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear
------------------------------------------------------------------------------------------------------------------------------------------------------------》
内置二级缓存的使用简单配置步骤
1.cacheEnabled=true;(这个默认值就是true,想用二级缓存可以不做配置,不想用改成false,在大配置中)
<settings> <setting name="cacheEnabled" value="true"/><!--开启,他也是默认值--> <!--<setting name="cacheEnabled" value="false"/>--><!--关闭--> </settings>
2.实体类实现序列化接口Serializeble
由于我做的是关联查询,并且没有做延迟加载,所以俩个实体类都得实现Serializeble接口
3.在接口同名的xml小配置中
加入一个自闭和的<cache/>
------------------------------------------------------------------------------------------------------------------------------------------------------------》
内置二级缓存存在性证明
都已经知道一级缓存是sqlsession的级别,如果要是close掉,换成不同的sqlsession怎么办?
/*二级缓存*/ @Test public void t4SecondCacheHasExist(){ SqlSession session= MyBatisUtils.getSession(); IDeptDAO mapper = session.getMapper(IDeptDAO.class); Dept depts = mapper.findDeptnoALLEmpsMoreSql(1); System.out.println(depts.getDeptName()); session.close(); System.out.println("===================我是高冷的分割线====================="); SqlSession session2= MyBatisUtils.getSession(); IDeptDAO mapper2 = session2.getMapper(IDeptDAO.class); Dept depts2 = mapper2.findDeptnoALLEmpsMoreSql(1); System.out.println(depts2.getDeptName()); session2.close(); }
运行结果
但由于他对数据库只发了上面的sql,分割线后就没有去数据库去查找了,而sqlsession关闭掉了,并且又开了一个,说明二级缓存真的存在,是真的运用上了
@Mark今天写到这,下次继续完善