java技术--mybatis缓存

1.mybaits提供一级缓存,和二级缓存

(1)一级缓存是sqlSession级别的缓存
        <1>在操作数据库时需要构造sqlSession对象
        <2>如果是spring和mybaits整合之后的配置文件,一般以这种方式实现,SqlSessionFactory的创建:
            <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                <property name="dataSource" ref="dataSource"></property>
                 <!-- 自动扫描mapping.xml文件 -->
                 <property name="mapperLocations" value="classpath:com/cn/mapper/*.xml"></property>
            </bean>
        <2>在对象中有一个数据结构(HashMap),用于存储缓存数据
        <3>不同的sqlSession之间的缓存区域(HashMap)是互不影响的
        <4>默认一级缓存是打开的,关闭一级缓存,在mybatis-config.xml中设置
           <setting name="localCacheScope" value="STATEMENT" />
(2)二级缓存是mapper级别的缓存
        <1>多个sqlSession去操作同一个Mapper的sql语句
        <2>多个SqlSession可以公用二级缓存
        <3>二级缓存是跨sqlSession的 
        <4>默认使用的二级缓存框架是ehcache

2.一级缓存应用

(1)如果是查询相同的用户信息,不走一级缓存,因为session方法结束,sqlSession就关闭,一级缓存就清空
(2)查询缓存适合有大量相同查询的应用,不适合有大量数据更新的应用

3.二级缓存的工作原理

1)首先开启mybatis的二级缓存:
        <1>在核心配置文件mybatis-config.xml中加入以下代码
           <!-- 全局参数的配置: 默认开启(true-->
           <settings>
               <!-- 开启二级缓存 -->
                <setting name="cacheEnabled" value="true"/>
          </settings> 
        <2>cacheEnabled:对在此配置文件下的所有cache 进行全局性开/关设置。默认true
        <3>在Mapper文件中开启缓存,默认是不开启的,需要手动开启
        <!-- 每个Mapper文件使用一个缓存对象 -->
             <cache/>
       <!-- 如果是多个Mapper文件共用一个缓存对象 -->
             <cache-ref />
        <3>实体类User实现序列化接口
        <4>目的:为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一样在内存
(2)sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到二级缓存中
(3)如果SqlSession3去执行相同 mapper下sql,执行commit提交,清空该 mapper下的二级缓存区域的数据
(4)sqlSession2去查询用户id为1的用户信息,去缓存中找是否存在数据,如果存在直接从缓存中取出数据

4.禁用二级缓存(默认true:开启)

1)在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询
(2<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">

5.刷新缓存

1)在mapper的同一个namespace中,如果有insert、update、delete操作需要刷新缓存,如果不刷新缓存会出现脏读
(2)设置statement配置中的flushCache="true" 属性,默认情况下为true即刷新缓存
(3)当为select语句时:
    <1>flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存
    <2>useCache默认为true,表示会将本条语句的结果进行二级缓存
 (4)当为insert、update、delete语句时:
    <1>flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空
    <2>useCache属性在该情况下没有   

6.二级缓存应用场景

1)对于访问多的查询请求且用户对查询结果实时性要求不高
        <1>采用二级缓存技术降低数据库访问量
        <2>提高访问速度
(2)实现方法如下:
        <1>通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存
        <2>根据数据变化频率设置缓存刷新间隔 flushInterval(比如设置为30分钟、60分钟、24小时等,根据需求而定)
        <3>在MyBatis中,延迟加载是默认关闭的,需要在配置文件的Setting中开启就可以完成延迟加载

7.默认二级缓存的局限性

1)对细粒度的数据级别的缓存实现不好,比如如下需求:
      <1>对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息
      <2>此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息
      <3>因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空
(2)解决此类问题需要在业务层根据需求对数据有针对性缓存  
(3)mybatis自身实现二级缓存弊端在于只能作用于数据库,此时需要引用第三方库作为缓存库,这样缓存更具有扩展性
(4)在MyBatis中,默认的二级缓存Cache实现是PerpetualCache
    <1>内部使用HashMap实现,这种方式满足不了分布式集群的项目
    <2>服务器重启后就没有缓存了
    <3>只适用于不常进行增、删、改的数据,一但数据变更,MyBatis会清空缓存
    <4>mapper级别到二级缓存默认是不开启的,若开启二级缓存对象必须实现Serializable接口

8.mybatis缓存

1)mybatis自身带一、二级缓存
(2)mybatis自身的二级缓存的替代产品
       <1>使用ehcache代替
       <2>在xxxMapper.xml中的namespace下,添加<cache /> 即可
       <3>以下两个<cache>标签二选一,第一个可以输出日志,第二个不输出日志
        <cache type="org.mybatis.caches.ehcache.LoggingEhcache" />
        <cache type="org.mybatis.caches.ehcache.EhcacheCache" />
       <4>使用redis替代  
发布了143 篇原创文章 · 获赞 10 · 访问量 7554

猜你喜欢

转载自blog.csdn.net/qq591009234/article/details/103618723
今日推荐