简介
一般来说,应用处理请求的速度取决于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的官方文档。