缓存
我们都知道,一个JAVA程序中,使用SQL对数据库进行操作是比较慢且耗费资源的。MyBatis为了提高查询的效率,减少访问数据库的次数,提供了缓存机制,将之前查询的数据放入内存中,用于减轻数据查询的压力,提升读取数据的速度,提高性能。
两类缓存
一级缓存:
● 很多情况下,在一次数据库会话下,会有多次查询是完全相同的,这必然会造成资源的浪费,MyBatis针对这类环境设置了一 级缓存。第一次查询完成后,将结果集放在一级缓存中,相同查询会直接在一级缓存中寻找结果集,如果命中,就直接返回, 提高性能。
● 一级缓存默认开启,并且是session级别,代表所有在此会话中的SQL都共享这个缓存。
我们可以通过配置,让一级缓存的级别变成statement级别,代表这个缓存只对当前执行的这个statement有效
<setting name="localCacheScope" value="SESSION"/>
● 当会话里执行了(update/insert/delete)这三个语句后,一级缓存会被刷新。
● 手动刷新一级缓存:session.clearCache()。
二级缓存
● 二级缓存是SqlSessionFactory级别的缓存,所有的SqlSession共享,当开启了二级缓存后,MyBatis会优先去命中二级缓存, 如果没有,再去命中对应的一级缓存,最后才是访问数据库。
● 二级缓存需要开启,其配置项是
<setting name="cacheEnabled" value="true"/>
并且要指定哪些映射文件里的SQL影响该缓存,在相应映射文件namespace下添加<cache><cache/>。
● 二级缓存的使用,当会话被关闭或提交时(session.commit()\session.close()),一级缓存中的内容会被刷入二级缓存。
● 二级缓存会被同一个namespace下的(update/insert/delete)操作给刷新。
● 禁用二级缓存,在相应的select标签中添加属性useCache。
<select id="findByCatch" parameterType="int" resultType="entity.Blog" useCache="false"> select * from blog where id = #{id} </select>
● 设定是否刷新二级缓存,在相应的(update/insert/delete)标签中添加属性flushCache。
<insert id="insert" parameterType="entity.Author" flushCache="false"> insert into author(id,username,password,email,bio) values(#{id},#{username},#{password},#{email},#{bio}) </insert>● 注意事项,二级缓存映射类要实现序列化,二级缓存的储存介质不一定在内存上,实现序列化之后,储存的对象能够放在远程 服务器上。使相应的映射类继承Serializable接口