
目录
mybatis的一级缓存,指的是在一个SqlSession域内,session没有关闭的时候,执行缓存就会根据sql为key 进行缓存,如果缓存的那个数据进行了数据库操作,比如修改,删除等,mybatis的做法是将它从缓存中清掉,再查询的时候再往缓存里放,能保存缓存的准确性
mybatis默认支持一级缓存
public static void main(String[] args) throws IOException {
SqlSession session=MybatisUtil.oppenSession();
UserMapper userMapper=session.getMapper(UserMapper.class);
UserInfo user1=userMapper.getUserById(2); //进行查询,放缓存
UserInfo user2=userMapper.getUserById(2); //命中缓存
UserInfo user3=userMapper.getUserById(2); //命中缓存
UserInfo user6=userMapper.getUserById(3); //进行查询,放缓存
UserInfo user7=userMapper.getUserById(2); //命中缓存
UserInfo user8=userMapper.getUserById(2); //命中缓存
UserInfo user10=userMapper.getUserById(3); //命中缓存
UserInfo user11=userMapper.getUserById(3); //命中缓存
session.close();
}
从日志中可以看到,只输出2条查询语句
一级缓存,离不开 session 域,它的价值
缓存的更新机制 :当某一个作用域(一级缓存的作用域是SqlSesiion,二级缓存的作用域是Namespace),进行了C/U/D (增删改)操作后,
默认该作用域下,所有的select中的缓存将被 clear ,这一点,一级缓存也是相同的
-- 映射文件中,所有的select语句将会被缓存
-- 映射文件中的 所有的 insert ,update,delete 语句都会刷新缓存
-- 缓存使用 Least Recently Used (最近最少使用的) 的算法进行回收
-- 缓存会根据指定的时间间隔来刷新
-- 缓存默认会存储 1024个对象
flushInterval ="60000" //自动刷新的时间间隔 60s
size="512" //最多缓存 512个对象
readonly ="true" //只读
type="org.mybatis.caches.ehcache.LoggingEhcach" //指定缓存的提供者
/>
(1) 当 为select语句的时候,
flushCache 默认为false ,表示任何时候这个select语句执行,都不用清空缓存
userCache 默认为true , 表示对本条语句的执行结果进行缓存,并且使用缓存中的结果
(2) 当 为 upate,insert,delete 时
flushCache 默认为true ,表求执行这条语句,将会清空缓存
useCache 在该情况下没有,因为一个更新的语句怎么可以使用缓存呢
如果有必要,可以进行手功修改
1) 导入 相关的jar包
mybatis-ehcache-1.0.3.jar
ehcache-core-2.6.8.jar
slf4j-api-1.6.1.jar
2) 在配置文件中 比如 UserMapper.xml 中
//以下两个标签二选一
3) ehcache 的配置文件 ehcache.xml ,放在 config(类路径下) 即可
//如果往磁盘上放,默认放在哪个目录
Cache使用时的注意事项
附: 关于mybatis中的二级缓存
可能会有很多人不理解这里,二级缓存带来的好处远远比不上他所隐藏的危害。
有关这样单表的操作可能不常见。但是你也许想到了一种常见的情况。
首先不管多表操作写到那个namespace下,都会存在某个表不在这个namespace下的情况。
例如两个表:role和user_role,如果我想查询出某个用户的全部角色role,就一定会涉及到多表的操作。
看到这里,实际上就是说,二级缓存不能用。再说多了也就没啥用