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

        为了提升查询效率和减少数据库的查询压力,mybatis提供了一级和二级缓存。
        mybatis的缓存是在Cache接口中,它只有一个默认的实现类PerpetualCache,用HashMap实现,剩下的都是装饰类

    一级缓存

        一级缓存是在sqlSession层面的,所以在参数和sql完全一样的情况下查询才会走一级缓存。默认开启,不需要任何的配置。
        存放位置sqlSession实现类DefaultSqlSession中的Executor属性,存放了缓存,Executor的实现类BaseExecutor中的PerpetualCache localCache;
        失效:同一个会话中,update(包括delete)会导致一级缓存失效。如果其它会话更新了数据,那么会读取到脏数据。

    二级缓存    

        可以解决一级缓存不能跨会话共享的问题。范围是namespace级别,只要是同一个namespace可以被多个session共享。生命周期和应用同步。
        开启方法:
            第一步:<setting name="cacheEnabled" value="true"/> 在主配置文件中配置cacheEnabled属性,默认为true。
            第二步:在Mapper中配置<cache/>标签。配置了之后,select会被缓存,update,delete,insert会刷新缓存。
            <select id="selectBlog" resultMap="BaseResultMap" useCache="false">  useCache="false" 关闭当前statementid二级缓存
       存放位置: 存储在Executor的装饰类CachingExecutor中(TransactionalCache真正持有了cache对象),其实CachingExecutor是对BaseExecutor的装饰。取数据时,先看二级缓存有没有命中,在查看一级缓存。
        执行流程

    什么时候开启二级缓存

        1,因为所有的增删改都会刷新二级缓存,所以建议在以查询为主的引用中使用。例如交易查询,订单查询,否则缓存就失去了意义。
        2,如果有两个namespace对同一张表进行了操作,那么可能导致脏数据。<cache-ref>标签可以解决跨namespace缓存共享的问题。
        <cache-ref namespace="com.gupaoedu.crud.dao.DepartmentMapper" />,这种情况下,多个Mapper的操作都会引起缓存的刷新,缓存的意义已经不大了。







  • 相关阅读:
    The analysis of China's holding the Olympic Games
    ASP.NET获取客户端的操作系统、浏览器、.NET版本等信息(图)
    ASP.NET 无提示关闭窗口
    VC 使用CryptoAPI计算Hash值:MD5, SHA
    SQL Server 2005 中设置某个用户对某一个数据库有完全控制的权限
    C# 计算文件的MD5值
    VC 获取物理网卡的MAC地址
    哪些免费邮箱不在邮件内容里插广告?
    忆同学
    使用正则表达式获取连接字符串某项的值
  • 原文地址:https://www.cnblogs.com/gaojf/p/12869724.html
Copyright © 2011-2022 走看看