mybatis一级缓存、二级缓存初探

首先,先清除mybatis一级缓存和二级缓存的作用域。

        一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。(https://www.cnblogs.com/little-fly/p/6251451.html)

        这句话怎么理解呢?也就是一级缓存是在同一个SqlSession下有效的。SqlSession关闭则缓存释放。下面代码就是一个一级缓存的例子。并没有重新获取SqlSession。第二个mapper.getPerson()就是直接查询的一级缓存。不查询数据库。

       注:Mybatis默认开启一级缓存

/**
 * @author cuimiao
 * @version 0.0.1
 * @since 0.0.1 2017-11-21
 */
public class Demo {
  public static void main(String[] args) throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "development_test");
    //SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession session = sqlSessionFactory.openSession();
    try {
      BlogMapper mapper = session.getMapper(BlogMapper.class);
      Person person = mapper.getPerson();
      System.out.println();
      Person person2 = mapper.getPerson();
      System.out.println();
    } finally {
      session.close();
    }
  }
}
        二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
        也就是,在不用的页面(不同的session中)查询同一个sql的缓存。下面是二级缓存的代码示例

/**
 * @author cuimiao
 * @version 0.0.1
 * @since 0.0.1 2017-11-22
 */
public class DemoCache {
  public static void main(String[] args) throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "development_test");
    //SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession session = sqlSessionFactory.openSession();
    SqlSession session2 = sqlSessionFactory.openSession();
    try {
      BlogMapper mapper = session.getMapper(BlogMapper.class);
      Person person = mapper.getPersonById(1);
      session.close();//这个close必须要加,不然缓存存不进去。
      System.out.println();
      BlogMapper mapper2 = session2.getMapper(BlogMapper.class);
      Person person2 = mapper2.getPersonById(1);
      session2.close();
      System.out.println();
    } finally {
      session.close();
    }
  }
}

这里我开启了两个session。但查询的同一条sql。这个时候,第二个查询条件走的二级缓存,并不查询数据库。

这里遇到了坎坷,感谢https://www.cnblogs.com/shenxiaoquan/p/5796733.html这个链接。

session.close()不执行的话,是不能把sql加入缓存的。也就是只有在session关闭后,缓存才被添加,后面的sql查询才可以用缓存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值