MyBatis理解与掌握(缓存)

MyBatis理解与掌握(缓存)

@(MyBatis)[Java, 框架, MyBatis]java

一级缓存(SqlSession)

默认就能够使用sql

框架处理缓存是 依赖sql映射id ,Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。数据库

一级缓存的做用域是一个SqlSession ,一旦session发生变化,一级缓存失败缓存

在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操做,则SqlSession的缓存清空。session

clipboard.png

每次查询会先去缓存中找,若是找不到,再去数据库查询,而后把结果写到缓存中。mybatis

二级缓存(SqlSessionFactory)

默认没法使用app

若是想要使用,须要进行配置, 在映射文件中增长标签<cache></cache>框架

要求缓存类必须实现可序列化接口spa

clipboard.png

二级缓存是mapper级别的。Mybatis默认是没有开启二级缓存。code

第一次调用mapper下的SQL去查询用户信息。查询到的信息会存到该mapper对应的二级缓存区域内。

第二次调用 相同namespace下的mapper映射文件中相同的SQL 去查询用户信息。会去对应的二级缓存内取结果。

若是调用相同namespace下的mapper映射文件中的增删改SQL,并执行了commit操做。此时会清空该namespace下的二级缓存。

使用二级缓存

(1)主配置文件mybatis-config.xml中作以下配置:

<settings>
    <setting name="lazyLoadingEnabled" value="true" />
    <setting name="aggressiveLazyLoading" value="false" />
    <setting name="cacheEnabled" value="true"/>
</settings>

2)在映射文件中,加入如下内容,开启二级缓存:

<cache eviction="" flushInterval="" readOnly="true" size=""/>
  • eviction:移除策略。
  • LRU:最近最少使用的对象会被移除。
  • FIFO:First In First Out
  • flushInterval:缓存刷新时间(毫秒)
  • readOnly:只读。二级缓存中一旦修改了数据,别人取到的缓存数据就不许确了,因此要设置为readonly
  • size:1024(个)

(3)缓存类实现序列化
因为二级缓存的数据不必定都是存储到内存中,它的存储介质多种多样,因此须要给缓存的对象执行序列化。
若是该类存在父类,那么父类也要实现序列化。

禁用二级缓存

该statement中设置userCache=false能够禁用当前select语句的二级缓存,即每次查询都是去数据库中查询,默认状况下是true。

<select id="" parameterType="" resultType="" useCache="false">
    ....
</select>

刷新二级缓存

<select id="" parameterType="" resultType="" useCache="false" flushCache="true">
    ....
</select>
相关文章
相关标签/搜索