MyBatis 包含一个很是强大的查询缓存特性,它能够很是方便地配置和定制。MyBatis 3 中的缓存实现的不少改进都已经实现了,使得它更增强大并且易于配置。java
默认状况下是没有开启缓存的,除了局部的 session 缓存,能够加强变现并且处理循环 依赖也是必须的。要开启二级缓存,你须要在你的 SQL 映射文件中添加一行:git
<cache/>
字面上看就是这样。这个简单语句的效果以下:github
全部的这些属性均可以经过缓存元素的属性来修改。好比:算法
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
这个更高级的配置建立了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,并且返回的对象被认为是只读的,所以在不一样线程中的调用者之间修改它们会 致使冲突。spring
可用的收回策略有:apache
默认的是 LRU。缓存
flushInterval(刷新间隔)能够被设置为任意的正整数,并且它们表明一个合理的毫秒 形式的时间段。默认状况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。安全
size(引用数目)能够被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。session
readOnly(只读)属性能够被设置为 true 或 false。只读的缓存会给全部调用者返回缓 存对象的相同实例。所以这些对象不能被修改。这提供了很重要的性能优点。可读写的缓存 会返回缓存对象的拷贝(经过序列化) 。这会慢一些,可是安全,所以默认是 false。mybatis
除了这些自定义缓存的方式, 你也能够经过实现你本身的缓存或为其余第三方缓存方案 建立适配器来彻底覆盖缓存行为。
<cache type="com.domain.something.MyCustomCache"/>
这个示 例展 示了 如何 使用 一个 自定义 的缓 存实 现。type 属 性指 定的 类必 须实现 org.mybatis.cache.Cache 接口。这个接口是 MyBatis 框架中不少复杂的接口之一,可是简单 给定它作什么就行。
public interface Cache { String getId(); int getSize(); void putObject(Object key, Object value); Object getObject(Object key); boolean hasKey(Object key); Object removeObject(Object key); void clear(); }
要配置你的缓存, 简单和公有的 JavaBeans 属性来配置你的缓存实现, 并且是经过 cache 元素来传递属性, 好比, 下面代码会在你的缓存实现中调用一个称为 “setCacheFile(String file)” 的方法:
<cache type="com.domain.something.MyCustomCache"> <property name="cacheFile" value="/tmp/my-custom-cache.tmp"/> </cache>
你可使用全部简单类型做为 JavaBeans 的属性,MyBatis 会进行转换。 And you can specify a placeholder(e.g. ${cache.file}) to replace value defined at configuration properties.
Since 3.4.2, the MyBatis has been supported to call an initialization method after it's set all properties. If you want to use this feature, please implements the org.apache.ibatis.builder.InitializingObject interface on your custom cache class.
public interface InitializingObject { void initialize() throws Exception; }
http://www.jianshu.com/p/2d654b0fca56
回想一下上一节内容, 这个特殊命名空间的惟一缓存会被使用或者刷新相同命名空间内 的语句。也许未来的某个时候,你会想在命名空间中共享相同的缓存配置和实例。在这样的 状况下你可使用 cache-ref 元素来引用另一个缓存。
<cache-ref namespace="com.someone.application.data.SomeMapper"/>
注意:缓存配置和缓存实例是绑定在 SQL 映射文件的命名空间是很重要的。所以,全部在相同命名空间的语句正如绑定的缓存同样。 语句能够修改和缓存交互的方式,或在语句的语句的基础上使用两种简单的属性来彻底排除它们。默认状况下,语句能够这样来配置:
<select ... flushCache="false" useCache="true"/> <insert ... flushCache="true"/> <update ... flushCache="true"/> <delete ... flushCache="true"/>
由于那些是默认的,你明显不能明确地以这种方式来配置一条语句。相反,若是你想改 变默认的行为,只能设置 flushCache 和 useCache 属性。好比,在一些状况下你也许想排除 从缓存中查询特定语句结果,或者你也许想要一个查询语句来刷新缓存。类似地,你也许有 一些更新语句依靠执行而不须要刷新缓存。
要想使某条Select查询支持二级缓存,你须要保证:
https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases
spring-boot-student-mybatis工程