Mybatis 缓存
2017-06-23 本文已影响65人
Real_man
简介
一般来说,应用处理请求的速度取决于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缓存的一些配置
- 主配置文件中,CacheEnabled 关闭二级缓存,一级缓存仍然可以使用
- Mapper.xml文件中,<Select useCache=true>,一级缓存仍然可以使用,关闭的是二级缓存
- Mapper.xml文件中,FlushCache,都是默认为true,增删改执行完成之后就会清楚缓存。如果查询也设置这个属性,那么缓存就不会使用
- 程序运行中,sqlSession.clearCache() 清楚第一级缓存
- 主配置文件中,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的官方文档。