zoukankan      html  css  js  c++  java
  • mybatis查询缓存

    一级缓存针对每个sqlSession进行缓存,sqlSession销毁,一级缓存就不存在. ,使用Map存储了sql执行查询结果集(java对象)

    二级缓存针对每个map的namespace进行缓存. mybatis程序运行起来二级缓存的数据结构就创建出来,直到mybatis程序停止二级缓存数据结构销毁

     map中存储了sql执行查询的结果集(java对象) 二级缓存是在configeration的全局数据结构当中

    要想执行二级缓存sqlSession必须关闭.

    1.1 一级缓存原理 

     

    如果执行增删改操作,执行commit,会清空sqlsession缓存.

    跟踪源代码,一级缓存的区域:

    1.2 二级缓存原理 

    如果sqlsession3执行增删改,执行commit后,UserMapper下的所有缓存全部清空.

     1.开启二级缓存 

      mybatis对一级缓存是默认支持,二级缓存需要开启

    打开总开关:在核心配置文件SqlMapConfig.xml加入:<setting name="cacheEabled "  value="true">

    打开mapper的二级开关:在mapper.xml中加入:<cache/>

    对象序列化

    mybatis支持使用第三方缓存框架实现二级缓存数据的存储,要求对象必须实现序列化(实体类 implements Serializable)。

    通过源码跟踪:

     

    设置statement是否二级缓存

    useCache=true表示要二级缓存,一般要对查询进行二级缓存。

    useCache=false,查询该 statement不进行二级缓存,针对那些查询非常频繁的语句,信息的变化性较高,可以将useCache设置false不进行二级缓存。

    刷新缓存

    针对insertupdatedelete这些statement设置flushCache="true" 表示执行commit就清空二级缓存,如果设置flushCache="false",执行操作也不清空缓存。

    一般情况下需要设置flushCache="true" ,为了避免查询出脏数据。

     其它的参数

    flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

    size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024

    readOnly(只读)属性可以被设置为truefalse。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false

  • 相关阅读:
    Java学习小记 16
    Java学习小记 15
    Java学习小记 14
    Java学习小记 13
    Java学习小记 12
    Java学习小记 11
    Java学习小记 10
    MySql 5.0 以上版本的varchar和text数据类型可以存的汉字个数
    java获取当前上一周、上一月、上一年的时间
    ArtifactsFilter ClassNotFoundException
  • 原文地址:https://www.cnblogs.com/wwwzzz/p/8285056.html
Copyright © 2011-2022 走看看