[MyBatis]二级缓存

二级缓存:

  • Session去执行该Mapper下的查询方法时(第一次查询),会将该查询结果存放在Mapper的二级缓存区域
  • Session去执行该Mapper下的查询方法时(第二次查询),会判断该Mapper下有没有缓存,如果有,则不向数据库查询,直接取缓存
  • Session去执行该Mapper下的commit()方法后,则清空该Mapper下的二级缓存

二级缓存与一级缓存的区别:

多个Session可以共享Mapper下的数据,二级缓存是按照Mapper的namespace划分,每一个Mapper都有自己的二级缓存区域,如果两个Mapper的namespace相同,那么这两个Mapper共用一个二级缓存区域

开启二级缓存:

  • 先向总配置文件开启二级缓存,SqlMapConfig.xml中
<configuration>
    <!--
        //....
    -->

    <!-- 全局配置参数,需要时再设置 -->
    <settings>
        <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>

</configuration>
  • 在Mapper.xml中
<mapper namespace="mapper.OrdersMapper" >
    <!--
        //....
    -->

    <!-- 开启本mapper下的namespace二级缓存 -->
    <cache />
</mapper>
  • 在POJO类中实现序列化接口
public class Orders implements Serializable {
    /**
     * 为什么要实现Serializable接口呢?
     * 实际上mybaties在存储二级缓存数据时,不止是将数据存放在内存中,
     * 还会将数据存放在硬盘中,还可能会放在其他地方,有很多种可能性,
     * 所以要取硬盘中的数据时,因为实现了Serializable接口,
     * 就可以反序列化取了.
     */
}

禁用二级缓存

在Mapper.xml中,可以将个别select查询设置为禁用二级缓存

    <!--
        useCache:是否禁用二级缓存
                1>默认为true(开启二级缓存)
                2:false:禁用二级缓存
    -->
    <!-- 根据用户id查询订单 -->
    <select id="findOrdersByUserId" parameterType="int" resultMap="order_user"
            useCache="false" >
        SELECT
            o.*,
            u.username,u.sex,u.address
        FROM
            orders AS o , user AS u
        WHERE
            o.user_id = #{value} AND u.id = o.user_id
    </select>

刷新缓存(清空缓存)

在Mapper.xml中,可以将个别添加,删除,更新的statement设置刷新缓存属性,一般执行完commit()之后都会执行刷新缓存,所以一般不用设置此属性,使用默认值即可.

<!--
        flushCache:刷新缓存(就是清空缓存里的所有数据)
                  1>flushCache="true":开启刷新缓存
                  2>flushCache="false":关闭刷新缓存
        一般执行完commit()之后都会执行刷新缓存,
        刷新缓存也就是flushCache="true",
        可以避免脏读.
    -->
    <delete id="deleteUser" parameterType="int" flushCache="true">
        delete from user where id = #{id}
    </delete>
时间: 2024-07-31 06:42:05

[MyBatis]二级缓存的相关文章

深入了解MyBatis二级缓存

深入了解MyBatis二级缓存 标签: mybatis二级缓存 2015-03-30 08:57 41446人阅读 评论(13) 收藏 举报  分类: Mybatis(51)  版权声明:版权归博主所有,转载请带上本文链接!联系方式:[email protected] 目录(?)[+] 深入了解MyBatis二级缓存 一.创建Cache的完整过程 我们从SqlSessionFactoryBuilder解析mybatis-config.xml配置文件开始: Reader reader = Reso

MyBatis二级缓存配置

正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 Mybatis二级缓存是SessionFactory,如果两次查询基于同一个SessionFactory,那么就从二级缓存中取数据,而不用到数据库里去取了. 1. 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存与一级缓存其机制相同,默认也是采用

如何细粒度地控制你的MyBatis二级缓存(mybatis-enhanced-cache插件实现)

前几天网友chanfish 给我抛出了一个问题,笼统地讲就是如何能细粒度地控制MyBatis的二级缓存问题,酝酿了几天,觉得可以写个插件来实现这个这一功能.本文就是从问题入手,一步步分析现存的MyBatis的二级缓存的不足之处,探讨一点可以改进的地方,并且对不足之处开发一个插件进行弥补. 本文如下组织结构: 一个关于MyBatis的二级缓存的实际问题 当前MyBatis二级缓存的工作机制 mybatis-enhanced-cache插件的设计和工作原理 mybatis-enhanced-cach

使用redis做mybaties的二级缓存(2)-Mybatis 二级缓存小心使用

Mybatis默认对二级缓存是关闭的,一级缓存默认开启: 下面就说说为什么使用二级缓存需要注意: 二级缓存是建立在同一个namespace下的,如果对表的操作查询可能有多个namespace,那么得到的数据就是错误的. 举个简单的例子,订单和订单详情,orderMapper.orderDetailMapper.在查询订单详情时我们需要把订单信息也查询出来,那么这个订单详情的信息被二级缓存在orderDetailMapper的namespace中,这个时候有人要修改订单的基本信息,那就是在orde

Mybatis二级缓存的简单应用

1.接口 public interface MemberMapperCache { public Members selectMembersById(Integer id); } 2.POJO类 实现序列化接口 public class Members implements Serializable { private static final long serialVersionUID = 1L; private Integer id; private String member_name;

mybatis二级缓存详解

1  二级缓存简介 二级缓存是在多个SqlSession在同一个Mapper文件中共享的缓存,它是Mapper级别的,其作用域是Mapper文件中的namespace,默认是不开启的.看如下图: 整个流程是这样的(不考虑第三方缓存库): 当开启二级缓存后,在配置文件中配置<setting name="cacheEnabled" value="true"/>这行代码,Mybatis会为SqlSession对象生成Executor对象时,还会生成一个对象:C

mybatis二级缓存问题

a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } a:hover { outline: 0; } a:active { outline: 0; } a:hover { color: #005580 !important; text-decoration: underline !important; } blockquote small:b

myBatis学习(9):一级缓存和二级缓存

正如大多数持久层框架一样,MyBatis同样提供了一级缓存和二级缓存的支持 1. MyBatis一级缓存基于PerpetualCache的HashMap本地缓存,其存储作用域为 Session,默认情况下,一级缓存是开启状态的.当 Session flush(); 或 close(); 之后,该Session中的所有 Cache 就将清空. 2.MyBatis二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Nam

mybatis结合redis实战二级缓存(六)

之前的文章中我们意见分析了一级缓存.二级缓存的相关源码和基本原理,今天我们来分享下了mybatis二级缓存和redis的结合,当然mybatis二级缓存也可以和ehcache.memcache.OSCache.Hazelcast结合使用.二级缓存相关的源码分享请参考<Mybatis源码分析之Cache二级缓存原理>.我们通过两种方式来实战,一种是自己编写缓存.另外一种是官方给出的demo地址:http://www.mybatis.org/redis-cache/ 一:自定义mybatis缓存