zoukankan      html  css  js  c++  java
  • 关于mybatis缓存配置讲解

    一级缓存:

    一级缓存是默认的.

    测试:在WEB页面同一个查询执行两次从日志里面看同样的sql查询执行两次。

    2次sql查询,看似我们使用了同一个sqlSession,但是实际上因为我们的dao继承了SqlSessionDaoSupport,而SqlSessionDaoSupport内部sqlSession的实现是使用用动态代理实现的,这个动态代理sqlSessionProxy使用一个模板方法封装了select()等操作,每一次select()查询都会自动先执行openSession(),执行完close()以后调用close()方法,相当于生成了一个新的session实例,所以我们无需手动的去关闭这个session()(关于这一点见下面mybatis的官方文档),当然也无法使用mybatis的一级缓存,也就是说mybatis的一级缓存在spring中是没有作用的.

    二级缓存:

    配置:

    <mapper namespace="com.cnblogs.yjmyzz.mybatis.mapper.OrderMapper">

        <cache 
            eviction="LRU"
            flushInterval="60000"
            size="1024"
            readOnly="true"
        />    
    ...
    </mapper>

    这里有几个要注意的地方:

    eviction是缓存的淘汰算法,可选值有"LRU"、"FIFO"、"SOFT"、"WEAK",缺省值是LRU

    flashInterval指缓存过期时间,单位为毫秒,60000即为60秒,缺省值为空,即只要容量足够,永不过期

    size指缓存多少个对象,默认值为1024

    readOnly是否只读,如果为true,则所有相同的sql语句返回的是同一个对象(有助于提高性能,但并发操作同一条数据时,可能不安全),如果设置为false,则相同的sql,后面访问的是cache的clone副本。

    上面这个是全局设置,在每条单独的sql语句上,还可以有局部设置,比如:

    <select id="getOrder" parameterType="int" resultType="TOrder"  useCache="false">
            ...
    </select>

    useCache="false"表示该select语句不使用缓存(即使xml最开头的全局cache启用)

    默认情况下,如果全局开启了缓存,insert/update/delete成功后,会自动刷新相关的缓存项,但有一点要特别注意:在mybatis与hibernate混用时,由于mybatis与hibernate的缓存是无关的,如果用mybatis做select查询,用hibernate做insert/update/delete,hibernate对数据的修改,并不会刷新mybatis的缓存。

  • 相关阅读:
    免备案 国外服务器 vps 推荐以及优惠码
    VSCode 实时预览 HTML 页面
    VPS 上安装 Nginx 就是这么简单
    Thinkphp 5 验证码无法正常显示的排错以及解决方案 【已解决】
    Composer 安装 topthink/think-captcha 时报错 requires topthink/framework ^6.0.0 【已解决】
    Linux ps命令
    MySQL 查询不区分大小写的问题以及编码格式问题
    Cyberduck 小黄鸭 跨平台的 FTP 软件
    MySQL 存储过程 详解
    php 四舍五入保留两位小数,自动补齐0
  • 原文地址:https://www.cnblogs.com/shenzhichipingguo/p/8891077.html
Copyright © 2011-2022 走看看