mybatis缓存机制

2019-03-16  本文已影响0人  李中凯_f395

一级缓存

SqlSession级别缓存,作用域在一次会话之间有效,默认开启

运行原理:

  1. 第一次执行select操作完毕后,会将查询到的结果缓存到map中。
  2. 第二次执行select操作时,如果传入的参数一样,就不去查询数据库而是直接返回,这样提高了效率。

注意:

  1. 在会话结束时会自动清除缓存。
  2. 如果执行了DML操作,并且commit了,会将缓存清除,避免脏读

二级缓存

SqlSessionFactory级别缓存,作用域在同一个namespace有效,默认关闭

如何配置

  1. 在mybatis配置文件中加入
<settings>
  <setting name="cacheEnabled" value="true"/>
</settings>
  1. 在mapper文件中配置
 <catche eviction="LRU" flushInterval="6000" size="512" readOnly="true"/>

这里配置了一个LRU缓存,并每隔60秒刷新,最大存储512个对象,而却返回的对象是只读的

若想禁用当前select语句的二级缓存,添加useCache="false"修改如下:

<select id="getCountByName" parameterType="java.util.Map" resultType="INTEGER" statementType="CALLABLE" useCache="false">

运行原理

  1. 当一个sqlsession进行select操作完毕时,将查询到的结果缓存到map中
  2. 当另一个sqlsession进行select操作时,先查询是否有一级缓存,如果没有再去查找二级缓存,找到了就换回,这样减少了服务器压力,提高性能。

注意:

当执行了DML操作,就会清除缓存,避免脏读。

了解:

mybatis二级缓存使用的是JVM的oscatch缓存,hibernate二级缓存使用>的是JVM的ehcatch缓存。
oscatch:主要针对数据库访问层
ehcatch:主要针对jsp页面缓存

上一篇 下一篇

猜你喜欢

热点阅读