Mybatis缓存及配置

  1. 问题引入:在本次查询中,因为查询多张表,中间还有遍历来构建一个树形菜单,导致查询时间达到7秒,ORM框架用的是Mybatis,考虑使用Mybatis的二级缓存。
  2. Mybatis的缓存分类:延迟加载,一级缓存,二级缓存
  3. 延迟加载:严格来说延迟加载不属于Mybatis缓存的范畴,但它的目的也是提高查询速度,所以在这一块说下。它是指在做关联查询时,利用延迟加载,先加载主信息,需要使用关联信息时再去加载关联信息。resultMap的association和collection的标签具有延迟加载的功能。需要在setting标签中配置来让延迟加载生效,如下:

    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
















    lazyLoadingEnabled和aggressiveLazyLoading配置的就是延迟加载的。我这边一般都是这样配置的。上面那个文件命名为:mybatis-env-setting.xml。在mybatis的核心配置文件mybatis.xml中配置sqlSessionFactory时将mybatis-env-setting.xml文件作为参数引入进来,如下:
    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" />
    

这样就引入了延迟加载的配置(二级缓存也是这样配置的)。
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文件中配置成如下:


eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true" />
//这里是增删查改的sql,全部省略

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

你可能感兴趣的:(JavaEE)