Mybatis 缓存

正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持
    一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
    二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
    对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。

1.一级缓存
<!--
    1. 若在一个 junit 测试方法中, 调用两次 Mapper 的方法, 则无法使用一级缓存.
    因为每一次调用 Mapper 方法, 实际上都获取了一个新的链接.
    2. 应该怎么测试呢 ?
    1). 在一个事务方法中多次调用一个 Mapper 的多个方法.
    2). 使用一个 SqlSession 对象.
-->
<select id="testCache" resultType="com.atguigu.mybatis.beans.Order">
    SELECT id, order_number
    FROM orders o
    WHERE o.id = #{id}
</select>
Order testCache(@Param("id") Integer id);
@Test
 public void testFirstLevelCache(){
      SqlSession session = sessionFactory.openSession();
      Order order1 = session.selectOne("com.atguigu.mybatis.mappers.OrderMapper.testCache", 1);
      System.out.println("------------------------------");
      Order order2 = session.selectOne("com.atguigu.mybatis.mappers.OrderMapper.testCache", 1);
      System.out.println(order1 == order2);
 }
2.二级缓存:
<!--
  若使用二级缓存, 则配置 cache 节点、且 bean 必须实现 Serializable 接口
  若使用 mybatis 默认的缓存方式, 则 bean 在缓存中保持的方式为 "散装数据".
-->
 <cache></cache>
<select id="testCache" resultType="com.atguigu.mybatis.beans.Order">
    SELECT id, order_number
    FROM orders o
    WHERE o.id = #{id}
</select>
Order testCache(@Param("id") Integer id);
@Test
     public void testSecondLevelCache() throws InterruptedException{
          SqlSession session = null;
          session = sessionFactory.openSession();
          Order order1 = session.selectOne("com.atguigu.mybatis.mappers.OrderMapper.testCache", 1);
          session.close();
          System.out.println("------------------------------");
          session = sessionFactory.openSession();
          Order order2 = session.selectOne("com.atguigu.mybatis.mappers.OrderMapper.testCache", 1);
          session.close();

          System.out.println(order1 == order2);
     }
3.使用自定义缓存 ehcache 作为缓存方式.
(1) 加入
ehcache-core-2.6.8.jar
mybatis-ehcache-1.0.3.jar
slf4j-api-1.6.1.jar
(2) 配置 type 属性为: org.mybatis.caches.ehcache.EhcacheCache
<cache type="org.mybatis.caches.ehcache.EhcacheCache">
  <property name="timeToLiveSeconds" value="3"/>
</cache>
<select id="testCache" resultType="com.atguigu.mybatis.beans.Order">
    SELECT id, order_number
    FROM orders o
    WHERE o.id = #{id}
</select>
     注意:可以配置属性, 具体的属性值可以参照 org.mybatis.caches.ehcache.EhcacheCache 中的 setter 方法.
(3) OrderMapper.java中:
Order testCache(@Param("id") Integer id);
(4) 测试类中:
@Test
     public void testSecondLevelCache() throws InterruptedException{
          SqlSession session = null;
          session = sessionFactory.openSession();
          Order order1 = session.selectOne("com.atguigu.mybatis.mappers.OrderMapper.testCache", 1);
          session.close();

          Thread.sleep(5000);

          System.out.println("------------------------------");
          session = sessionFactory.openSession();
          Order order2 = session.selectOne("com.atguigu.mybatis.mappers.OrderMapper.testCache", 1);
          session.close();

          System.out.println(order1 == order2);
     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员学习圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值