Mybatis缓存

本文介绍了Mybatis的缓存特性,包括一级缓存和二级缓存。一级缓存是SqlSession级别的,同一会话内的查询结果会被缓存,但增删改操作会导致缓存失效。二级缓存为SqlSessionFactory级别,需要手动开启并满足特定条件,如实体类实现序列化接口。查询顺序是先查二级缓存,再查一级缓存,最后才查询数据库。

Mybatis缓存**

  • mybatis包含了一个非常强大的查询缓存特性,他可以非常方便的定制和配置缓存。缓存可以极大的提高查询的效率

  • mybatis系统当中默认定义了两级缓存:一级缓存和二级缓存

    • 默认情况之下,只有一级缓存开启(sqlSession级别的缓存)
    • 二级缓存需要手动开启配置,需要局域namespace级别的缓存。
1.一级缓存

一级缓存也叫本地缓存

    • 与数据库同一次会话期间查询到的数据会放入的本地缓存当中。
    • 如果以后需要获取相同的数据直接去缓存当中拿,没必要再去查询数据库

缓存失效的情况

  • sqlSession不同
  • sqlSession相同,查询条件不同
  • sqlSession相同,两次查询之间执行了增删改操作!
  • sqlSession相同,手动清除一级缓存
二级缓存

二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactroy创建SqlSession查询结果会被缓存;此后若再次执行相同的查询语句,结果会从一个缓存中获取。

(1).二级缓存开启的条件

①:在核心配置文件中,设置全局属性caheEnable=“true”。

②:在映射件中置

③:查询数据所转换的实体类类型必须实现序列化接口

④:二级缓存必须在SqlSession关闭或提交之后有效

(2).二级缓存失效的情况

两次查询之间行了任意的增删改,会使得一级二级缓存同时失效

(3).开启二级缓存

①.在SqlMapConfig.xml配置文件中开启二级缓存

    <!‐‐ 开启二级缓存 ‐‐> 
    <settings>    
    <!--开启二级缓存-->    
    <setting name="cacheEnabled" value="true"/> 
    </settings>             

②. 在UserDao.xml配置文件声明使用二级缓存

   <!--使用二级缓存--> <cache/>              

③:查询数据所转换的实体类类型必须实现序列化接口

public class User implements Serializable {    
    private Integer id;    
    private String username;    
    private Date birthday;    
    private String sex;    
    private String address;    
    // get set方法 .....
}     

④:二级缓存必须在SqlSession关闭或提交之后有效

@Test public void findById() throws IOException {    
    // 1.加载SqlMapConfig配置文件    
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");    
    //2.创建sqlSessionFactory工厂    
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);    
    //3.sqlSessionFactory创建sqlSession    
    SqlSession sqlSession = factory.openSession();    
    SqlSession sqlSession2 = factory.openSession();     
    //4.通过Session创建UserDao接口代理对象    
    UserDao mapper = sqlSession.getMapper(UserDao.class);    
    User user1 = mapper.findById(1);    
    System.out.println(user1.toString());    
    // 将其一级缓存的数据放进二级缓存中,并清空一级缓存    
    sqlSession.close();     
    System.out.println("-----------------");    
    UserDao mapper2 = sqlSession2.getMapper(UserDao.class);    
    User user2 = mapper2.findById(1);    
    System.out.println(user2.toString());    
    // 将其一级缓存的数据放进二级缓存中,并清空一级缓存    
    sqlSession2.close();     
    System.out.println(user1 == user2);        
    resourceAsStream.close(); 
}       

(4).重要结论

打印发现2个对象的地址值不一样,但是确实只发送了一次SQL语句的查询,二级缓存中存储的是数据,不是对象。

三、Mybatis缓存查询顺序

  • 先查询二级缓存,因为二级缓存中可能会有其他程序查询出来的数据,可以直接拿来使用
  • 如果二级缓存命中,再查询一级缓存
  • 如果一级缓存也没有命中,则查询数据库
  • SqlSession关闭之后,一级缓存的数据会写入二级缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值