一级缓存
SqlSession级别缓存,作用域在一次会话之间有效,默认开启
运行原理:
- 第一次执行select操作完毕后,会将查询到的结果缓存到map中。
- 第二次执行select操作时,如果传入的参数一样,就不去查询数据库而是直接返回,这样提高了效率。
注意:
- 在会话结束时会自动清除缓存。
- 如果执行了DML操作,并且commit了,会将缓存清除,避免脏读
二级缓存
SqlSessionFactory级别缓存,作用域在同一个namespace有效,默认关闭
如何配置
- 在mybatis配置文件中加入
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
- 在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">
运行原理
- 当一个sqlsession进行select操作完毕时,将查询到的结果缓存到map中
- 当另一个sqlsession进行select操作时,先查询是否有一级缓存,如果没有再去查找二级缓存,找到了就换回,这样减少了服务器压力,提高性能。
注意:
当执行了DML操作,就会清除缓存,避免脏读。
了解:
mybatis二级缓存使用的是JVM的oscatch缓存,hibernate二级缓存使用>的是JVM的ehcatch缓存。
oscatch:主要针对数据库访问层
ehcatch:主要针对jsp页面缓存