Mybatis 缓存

简介

一般来说,应用处理请求的速度取决于CPU与应用内存。为了加速我们的应用,我们一般会采取如下措施:

  • 改善应用的算法性能

  • 多台机器,多个CPU进行并行计算

  • 升级CPU等

在应用中,我们需要减少对数据库的访问次数,因为获取数据需要花费时间,如果用能临时的储存获取的数据,供下次再次利用,那对我们将有一些帮助。缓存可以帮我们减少这些负载。

我们主要介绍Mybatis的缓存机制,与Mybatis和Encache的结合。

概念

  • Mybatis的一级缓存:指SqlSession。一级缓存的作用域是一个SqlSession。Mybatis默认开启一级缓存。在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则SqlSession的缓存清空。

  • Mybatis的二级缓存:指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。在同一个namespace下的mapper文件中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则二级缓存清空。

Mybatis缓存的一些配置

  1. 主配置文件中,CacheEnabled 关闭二级缓存,一级缓存仍然可以使用

  2. Mapper.xml文件中,<Select useCache=true>,一级缓存仍然可以使用,关闭的是二级缓存

  3. Mapper.xml文件中,FlushCache,都是默认为true,增删改执行完成之后就会清楚缓存。如果查询也设置这个属性,那么缓存就不会使用

  4. 程序运行中,sqlSession.clearCache() 清楚第一级缓存

  5. 主配置文件中,localCacheScope: 本地缓存作用域(一级缓存),Session,Statement,Global

Mybatis与ehcache结合

Ehcache是一个广泛使用缓存容器。详情请参考官方文档。Mybatis与Encache的集成,只依赖Encache-core包。想用Encache的更多功能,我们引入整个包。
pom.xml文件

        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.3</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.24</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.10</version>
        </dependency>

然后在Mapper.xml文件中

mapper namespace="org.acme.FooMapper">  <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
  ...</mapper>

也可以动态的修改参数

mapper namespace="org.acme.FooMapper">  <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    <property name="timeToIdleSeconds" value="3600"/><!--1 hour-->
    <property name="timeToLiveSeconds" value="3600"/><!--1 hour-->
    <property name="maxEntriesLocalHeap" value="1000"/>
    <property name="maxEntriesLocalDisk" value="10000000"/>
    <property name="memoryStoreEvictionPolicy" value="LRU"/>
  </cache>
  ...</mapper>

一般我们还要再资源目录下配置一个ehcache.xml文件,ehcache.xml文件的详细配置请参考ehcache的官方文档。

参考

点赞