Mybatis入门--缓存问题

来源:互联网 发布:ubuntu grab引导 编辑:程序博客网 时间:2024/06/16 04:09

只要涉及持久化框架,必然少不了缓存机制。Mybatis的缓存分为一级缓存和二级缓存。一级缓存是存在于sqlSession中,而二级缓存范围更大,是可以被多个sqlSession所共用的。

一级缓存

提升查询效率

一个客户端,发送同样的查询请求,如果每次都去访问数据库,效率低下。在一个sqlSession的开启和关闭之间,会维护一个缓存对象。当查询的时候,如果在缓存中存在该数据,直接取出;如果不存在,访问数据库执行查询。

脏读问题

此时,会存在一个问题。如果在两个查询的间隔,有其他的语句改变了这个数据,会导致前后读取数据存在不一致的现象。这就是所谓的脏读。
Mybatis的解决方法是,在commit一个数据的时候,会清空该条数据的缓存,所以在第二次查询的时候,依旧会从数据库中读取。

手动清除缓存

在查询前,可以手动调用sqlSession的clearCache()方法,这样就会将所有缓存清除,从而重新读取数据库中的数据。

二级缓存

当sqlSession关闭后,它的缓存也就被清除了。如果有些数据需要被多个sqlSession共享,那么就用到了二级缓存。二级缓存是根据nameSpace,也就是mapper来划分的。

开启二级缓存

默认情况下该缓存是关闭的,需要在configuration.xml配置文件中设置。

<setting name="cacheEnabled" value="true"/>

同时,还需要再mapper配置文件的mapper节点里添加上<cache/>,表示这个mapper开启二级缓存:

<cache/>

关闭某个查询的二级缓存

在开启二级缓存的情况下,如果某个查询它需要不使用缓存,可以在mapper.xml文件中单独设置,使用useCache="false"属性。

<select id="selectOrdersByUserId" resultMap="ordersUserMap" useCache="false">    //doSqlWork</select>

flushCache、useCache说明

  • 在select语句中。
    flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
    useCache默认为true,表示会将本条语句的结果进行二级缓存。
  • 在insert、update、delete语句中。
    flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。
    useCache属性在该情况下没有。

刷新缓存

如果说,某个mapper需要间隔一段时间就重新加载一次缓存。
现在,需要修改<cache/>

<cache  eviction="FIFO"  flushInterval="60000"  size="512"  readOnly="true"/>

eviction是一个回收策略,具体如下:

  • LRU – 最近最少使用的:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
  • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

实现Serilizable接口

要进行二级缓存的对象必须实现Serilizable接口,因为它有可能被存放在硬盘或者其他地方。

1 0
原创粉丝点击