zoukankan      html  css  js  c++  java
  • Mybatis 缓存

    一级缓存

    一级缓存:SqlSession级别的缓存,基于PerpetualCache的HashMap本地缓存,其存储作用域为同一个SqlSession
    
    
    public class Start2 {
        public static void main(String[] args) throws IOException {
            
            String resource = "mybatis-config.xml";
            InputStream  inputStream = Resources.getResourceAsStream(resource);
            //创建SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //true表示自动提交。否则需要使用commit方法才会提交。默认是false
            SqlSession session = sqlSessionFactory.openSession();
    
            //拿到接口的代理对象
            Dao dao=session.getMapper(Dao.class);
    
            //拿到了dao这个对象接下来就可以创建sql语句了(直接调用接口方法)
            List list1 = dao.selAll();
            //再做一次重复查询(由于设置了一级缓存,查询速度很快)
            List list2 = dao.selAll();
            session.commit();
        }
    }
    
    
    一级缓存是默认开启的,当创建SqlSession对象时候就开启了。
    
    一级缓存通过简单Map集合来实现,并没有对Map集合的大小,容量进行限制
    一级缓存是一个粗粒度的缓存,没有办法去精确控制缓存中的数据是否过期以及去更新缓存数据
    

    一级缓存中数据的有效期

    默认是开启的,如果不想用缓存,直接在select节点中增加 useCache="false" 和 flushCache="true" 属性即可。
    
    flushCache:将其设置为true,无论语句什么时候被调用,都会导致缓存被清空,避免数据库脏读。
    
    <select id="articles" parameterType="int" resultMap="result" useCache="false" flushCache="true">
    	select user.name from user where user.id = #{id}
    </select>
    
    
    SqlSession对象调用clearCache()方法的时候,会自动清除缓存中的数据。SqlSession对象还是可以正常使用。
    
    SqlSession对象关闭的时候,SqlSession对象就不能再使用了,缓存会失效。
    mybatis整合spring,一级缓存会失效,因为mybatis会在每次查询之后自动关闭sqlSession。
    
    当在两次相同的查询中间穿插了 新增 修改 删除 操作,也会清除缓存中的数据。
    

    二级缓存(避免使用)

    mybatis的二级缓存是基于application为生命周期
    
    默认采用基于PerpetualCache的HashMap存储,其存储作用域为Mapper(Namespace)。
    
    当某一个作用域(二级缓存Namespaces)进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear。
    
    
    MyBatis 默认没有开启二级缓存,开启只需在 mybatis-config.xml 配置文件中写入如下代码:
    
    	<settings>  
    		<setting name="cacheEnabled" value="true"/>  
    	</settings>
    
    
    mapper.xml中:
    
    	<!-- 回收策略为先进先出 -->
    	<!-- 自动刷新时间60s -->
    	<!-- 最多缓存512个引用对象 -->
    	<!-- 只读 -->
    	<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
    
    useCache=false:禁用二级缓存。
    
    
    避免使用原因:
    	多个Mapper(Namespace)可能对同一个表有相同的操作,会发送错误(两个命名空间下的数据不一致)
    
  • 相关阅读:
    JavaScript正则表达式(四)
    JavaScript三元运算符以及运算符顺序
    JavaScript进制转换
    JavaScript赋值运算符和关系运算符
    JavaScript输出
    hadoop1.2.1的安装
    SSH免费登录
    使用java poi解析表格
    【深入理解JVM】:Java类继承关系中的初始化顺序
    解决yum安装mysql时Requires: libc.so.6(GLIBC_2.17)(64bit)
  • 原文地址:https://www.cnblogs.com/loveer/p/11581096.html
Copyright © 2011-2022 走看看