打赏

mybatis_SQL缓存(5)

  1. <settings>  
  2.     <!-- 这个配置使全局的映射器启用或禁用缓存 -->  
  3.     <setting name="cacheEnabled" value="true"/>  
  4.     <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->  
  5.     <setting name="lazyLoadingEnabled" value="true"/>  
  6.     <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载 -->  
  7.     <setting name="aggressiveLazyLoading" value="true"/>  
  8.     <!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动) -->  
  9.     <setting name="multipleResultSetsEnabled" value="true"/>  
  10.     <!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动 -->  
  11.     <setting name="useColumnLabel" value="true"/>  
  12.     <!-- 允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby) -->  
  13.     <setting name="useGeneratedKeys" value="true"/>  
  14.     <!-- 指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况) -->  
  15.     <setting name="autoMappingBehavior" value="PARTIAL"/>  
  16.     <!-- 配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新 -->  
  17.     <setting name="defaultExecutorType" value="SIMPLE"/>  
  18.     <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->  
  19.     <setting name="defaultStatementTimeout" value="25000"/>  
  20. </settings>  


然后是SQL映射文件的配置

[html] view plain copy
 
  1. <cache     
  2.     eviction="FIFO"     
  3.     flushInterval="60000"     
  4.     size="1024"     
  5.     readOnly="true"/><pre style="DISPLAY: none" class="html" name="code"><select id="select" parameterType="string" resultType="integer" useCache=“false”>    
  6. select 1  
  7. </select></pre>  
  8. <pre></pre>  
  9.    
 
1. 所有在映射文件里的select 语句都将被缓存。
2. 所有在映射文件里insert,update 和delete 语句会清空缓存。
3. 缓存使用“最近很少使用”算法来回收
4. 缓存不会被设定的时间所清空。
5. 每个缓存可以存储1024 个列表或对象的引用(不管查询出来的结果是什么)。
6. 缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用

可用的收回策略(eviction)有: 

LRU –  最近最少使用的:移除最长时间不被使用的对象。 

FIFO –  先进先出:按对象进入缓存的顺序来移除它们。 

SOFT –  软引用:移除基于垃圾回收器状态和软引用规则的对象。 

WEAK –  弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。 

默认的是 LRU。

 

flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。 

size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值1024。 

readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。

 

 

一、MyBatis的Cache配置
1、全局开关:默认是true,如果它配成false,其余各个Mapper XML文件配成支持cache也没用。
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>

2、各个Mapper XML文件,默认是不采用cache。在配置文件加一行就可以支持cache:
 <cache />


3、Mapper XML文件配置支持cache后,文件中所有的Mapper statement就支持了。此时要个别对待某条,需要:
<select id="inetAton" parameterType="string" resultType="integer" useCache=“false”>  
select inet_aton(#{name})
</select>


 

4、刷新缓存的属性:flushCache="true"

在进行查找时就会直接从数据库查询而不是从缓存中查询,所以这样得来的数据才是最新的。


二、注意的几个细节
1、如果readOnly为false,此时要结果集对象是可序列化的。
<cache readOnly="false"/>

2、在SqlSession未关闭之前,如果对于同样条件进行重复查询,此时采用的是local session cache,而不是上面说的这些cache。

3、MyBatis缓存查询到的结果集对象,而非结果集数据,是将映射的PO对象集合缓存起来。

posted @ 2016-07-27 12:06  海米傻傻  阅读(1425)  评论(0编辑  收藏  举报