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

原创 2018年04月17日 11:18:47

缓存

我们都知道,一个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()),一级缓存中的内容会被刷入二级缓存。

● 二级缓存也会被(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】查询缓存(一级缓存和二级缓存)

一级缓存:是SQlSession级别的缓存。在操作数据库时需要构造SqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的SqlSession之间的缓存数据区域(Ha...
  • u013036274
  • u013036274
  • 2017-02-27 14:01:56
  • 2407

Mybatis的一级缓存和二级缓存机制

一级缓存的应用(自动开启,创建Sqlsession) 正式开发,是将mybatis和spring进行成和开发,事务控制在service中。一个service方法中包括很多mapper方法的调用。 ...
  • shaoduo
  • shaoduo
  • 2017-04-14 22:02:43
  • 886

mybatis 一级缓存和二级缓存简介

正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Ses...
  • zhongzh86
  • zhongzh86
  • 2015-11-24 23:10:36
  • 5996

MyBatis缓存分为一级缓存和二级缓存(二)

MyBatis 缓存 MyBatis缓存分为一级缓存和二级缓存 一级缓存 MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key被缓...
  • u014756827
  • u014756827
  • 2016-10-08 10:54:34
  • 1988

Mybatis一级、二级缓存

一级缓存首先做一个测试,创建一个mapper配置文件和mapper接口,我这里用了最简单的查询来演示。 SELEC...
  • u011403655
  • u011403655
  • 2015-06-30 15:07:28
  • 12347

MyBatis之缓存(一级缓存、二级缓存)

1,        MyBatis的解析 MyBatis的解析工作由XmlConfiguraBuilder类来实现的,它将MyBatis的所有配置信息解析到Configuration中,为之后的使用...
  • tomoto_zh
  • tomoto_zh
  • 2017-05-12 20:25:01
  • 256

mybatis中一级缓存和二级缓存的简单介绍

mybatis的一级缓存:   MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来, 当下次查询的时候,如果判断先前有个完全一样的查询,会直接从...
  • KevinwuwenboA
  • KevinwuwenboA
  • 2017-03-04 23:22:05
  • 446

MyBatis中的一级缓存和二级缓存介绍

先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能。 一级缓存 ...
  • weixin_36380516
  • weixin_36380516
  • 2017-06-13 20:07:22
  • 2756

MyBatis缓存分为一级缓存和二级缓存

一级缓存 MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key被缓存(跟mysql缓存一样,修改任何参数的值都会导致缓存失效) ...
  • jianfpeng241241
  • jianfpeng241241
  • 2015-11-02 16:39:08
  • 1040

MyBatis一级缓存,二级缓存,自定义缓存

像Hibernate一样,MyBatis也提供了缓存机制,一级缓存和二级缓存 一级缓存是在SqlSession的缓存,当Sqlsession关闭时,一级缓存也就结束了,一般在web应用中由于各种原...
  • snakeMoving
  • snakeMoving
  • 2017-01-06 16:15:57
  • 1298
收藏助手
不良信息举报
您举报文章:MyBatis学习笔记(四)一级缓存和二级缓存
举报原因:
原因补充:

(最多只允许输入30个字)