Mybatis缓存及配置

来源:互联网 发布:全国省市区街道数据库 编辑:程序博客网 时间:2024/06/05 04:48
  1. 问题引入:在本次查询中,因为查询多张表,中间还有遍历来构建一个树形菜单,导致查询时间达到7秒,ORM框架用的是Mybatis,考虑使用Mybatis的二级缓存。
  2. Mybatis的缓存分类:延迟加载,一级缓存,二级缓存
  3. 延迟加载:严格来说延迟加载不属于Mybatis缓存的范畴,但它的目的也是提高查询速度,所以在这一块说下。它是指在做关联查询时,利用延迟加载,先加载主信息,需要使用关联信息时再去加载关联信息。resultMap的association和collection的标签具有延迟加载的功能。需要在setting标签中配置来让延迟加载生效,如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    <settings>
    <!-- 打开延迟加载的开关 ,默认是false-->
    <setting name="lazyLoadingEnabled" value="true" />
    <!-- 将积极加载改为消息加载即按需加载 ,默认是true-->
    <setting name="aggressiveLazyLoading" value="false" />
    <!-- 开启驼峰 -->
    <setting name="mapUnderscoreToCamelCase" value="true" />
    <!-- 开启打印sql -->
    <setting name="logImpl" value="STDOUT_LOGGING" />
    <!-- 缓存开启 ,默认为false-->
    <setting name="cacheEnabled" value="true"/>
    </settings>
    <typeAliases>
    </typeAliases>
    </configuration>

    lazyLoadingEnabled和aggressiveLazyLoading配置的就是延迟加载的。我这边一般都是这样配置的。上面那个文件命名为:mybatis-env-setting.xml。在mybatis的核心配置文件mybatis.xml中配置sqlSessionFactory时将mybatis-env-setting.xml文件作为参数引入进来,如下:
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">      <property name="dataSource" ref="dataSource" />      <property name="configLocation" value="classpath:mybatis-env-setting.xml" />      <property name="mapperLocations" value="classpath:com/mappers/*.xml" />    </bean>

这样就引入了延迟加载的配置(二级缓存也是这样配置的)。
4. 一级缓存:Mybatis的一级缓存指的是sqlSession缓存,默认是开启的,它是会话级别的缓存,作用域是sqlsession。如:
serviceImpl{
//初始化创建sqlSession
第一次调用mapper的findUserById(1); //从数据库中读
第二次调用mapper的findUserById(1); //从一级缓存中读数据
//处理完毕关闭sqlsession
}
在一次查询中两次用到的findUserById(1)方法,那么第二次会从一级缓存中读数据,但是如果是两次执行这个serviceImpl方法,则第二次依然不会从一级缓存中读数据,因为sqlSession已经关闭了,一级缓存被清空了。可以看到一级缓存的局限性还是挺大的。
5. 二级缓存:二级缓存是指mapper的映射文件,它的作用域是namespace下mapper映射文件的内容,默认不开启,使用时需要自己配置。多个sqlSession可以共享二级缓存。在同一个namespace的mapper文件中,执行相同的sql第一次会去数据库中查询,并把查询结果写入缓存中,第二次再查询时,直接从缓存中查询数据。在两次查询之间如果发生了增删改操作,则二级缓存会被清空。
6. 如何开启二级缓存:1.在mybatis-env-setting.xml文件中将cacheEnabled改为true,开启全局二级缓存;2.在需要用二级缓存的mapper.xml文件中配置成如下:
<mapper namespace="com.dao.ImMenuDao" >
<!-- Cache 配置 -->
<cache
eviction="FIFO" <!--回收策略为先进先出-->
flushInterval="60000" <!--自动刷新时间60s-->
size="512" <!--最多缓存512个引用对象-->
readOnly="true" /> <!--只读-->
//这里是增删查改的sql,全部省略
</mapper>

到这里配置二级缓存的就结束了,经测试请求时间2秒多,速度提高了将近3倍。
7. 禁用二级缓存和刷新缓存:可以在mapper.xml中需要使用的statement中这样配置:userCache=false,禁止使用缓存;flushCache=true,刷新缓存

原创粉丝点击