MyBatis学习笔记(四)一级缓存和二级缓存

缓存

我们都知道,一个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接口


阅读更多
版权声明:本文为博主原创文章,未经允许禁止转载 https://blog.csdn.net/IcyDate/article/details/79970197
个人分类: MyBatis
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭