Mybatis知识点(缓存机制)

  1. 一级缓存(默认开启)

    不需要配置,一级缓存发生在sqlsession当sqlsession不变时执行同一个操作会用上缓存可以给数据库减少负担
    关于mybtis的缓存机制:《mybatis 3源码深度解析》有这样一段话:
    MyBatis的缓存分为一级缓存和二级缓存,一级缓存默认是开启的,而且不能关闭。至于一级缓存为什么不能关闭,MyBatis核心开发人员做出了解释:MyBatis的一些关键特性(例如通过建立级联映射、避免循环引用(circular references)、加速重复嵌套查询等)都是基于MyBatis一级缓存实现的,而且MyBatis结果集映射相关代码重度依赖CacheKey,所以目前MyBatis不支持关闭一级缓存。
    MyBatis提供了一个配置参数localCacheScope,用于控制一级缓存的级别,该参数的取值为SESSION、STATEMENT,当指定localCacheScope参数值为SESSION时,缓存对整个SqlSession有效,只有执行DML语句(更新语句)时,缓存才会被清除。当localCacheScope值为STATEMENT时,缓存仅对当前执行的语句有效,当语句执行完毕后,缓存就会被清空。
    MyBatis的一级缓存,用户只能控制缓存的级别,并不能关闭。
    配置参数具体在哪控制:
    <setting name="localCacheScope" value="SESSION"/>

  2. 二级缓存(需要手动开启)

    • 在MyBatis主配置文件中指定cacheEnabled属性值为true。

      <configuration>
        <!--开启二级缓存  -->
        <settings>
         <setting name="cacheEnabled" value="true"/>
        </settings>
       
        <environments default="development">
           <environment id="development">
               <!-- 配置JDBC事务控制,由mybatis进行管理 -->
               <transactionManager type="JDBC"></transactionManager>
               <!-- 配置数据源,采用dbcp连接池 -->
              <dataSource type="POOLED">
                  <property name="driver" value="com.mysql.jdbc.Driver"/>
                   <property name="url" value="jdbc:mysql://localhost:3306/survey?useUnicode=true&amp;characterEncoding=utf8"/>
                  <property name="username" value="root"/>
                  <property name="password" value="747452"/>
               </dataSource>
          </environment>
       </environments>
       
       
       <!-- 加载mapper映射文件 -->    
       <mappers>
      <mapper resource="dao/VoteUser.xml"/>
           
       </mappers>
      </configuration>
      
    • 在MyBatis Mapper配置文件中,配置缓存策略、缓存刷新频率、缓存的容量等属性,例如:

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper    
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"    
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="dao.VoteUserDao">
      <cache evition="FIFO"
       flushInterval="60000"
       size="512" readOnly="true"></cache>
      
    • 实现实体类序列化

      public class VoteUser implements Serializable
      
    • 二级缓存发生在Sqlsessionfactory里面需要同一个factory

posted @ 2021-10-22 22:29  旅祸少年  阅读(88)  评论(0)    收藏  举报