首页 > 其他 > 详细

Mybatis 缓存

时间:2020-12-18 20:27:51      阅读:37      评论:0      收藏:0      [点我收藏+]
  缓存是一般的 ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压
力,缓存的重要性是不言而喻的。Mybatis 会将相同查询条件的 SQL 语句的查询结果存储在
内存或者某种缓存介质当中,当下次遇到相同的查询 SQL 时候不在执行该 SQL,而是直接从
缓存中获取结果,减少服务器的压力,尤其是在查询越多、缓存命中率越高的情况下,使用
缓存对性能的提高更明显。
  
  
  MyBatis 缓存方式分为一级缓存和二级缓存,同时也可配置关于缓存设置。
    一级缓存是将结果缓存在 SqlSession 对象中,二级缓存是存储在 SqlSessionFactory 对象中。默认情况下,MyBatis 开启一级缓存,没有开启二级缓存。当数据量大的时候可以借助一些第三方缓存技术来协助保存 Mybatis 的二级缓存数据。
 
1, 一级缓存的使用:
  
  一级缓存也叫本地缓存,MyBatis 的一级缓存是在会话(SqlSession)层面进行缓存的。
  MyBatis 的一级缓存是默认开启的,不需要任何的配置。
技术分享图片

 

 

  一级缓存的生命周期:
    ? MyBatis 在开启一个数据库会话时,会创建一个新的 SqlSession 对象,SqlSession 对象中会有一个新的 Executor 对象。Executor 对象中持有一个新的 PerpetualCache 对象;当会话结束时,SqlSession 对象及其内部的 Executor 对象还有 PerpetualCache 对象也一并释放掉。
    ? 如果 SqlSession 调用了 close()方法,会释放掉一级缓存 PerpetualCache 对象,一级缓存将不可用。
    ? 如果 SqlSession 调用了 clearCache(),会清空 PerpetualCache 对象中的数据,但是该对象仍可使用。
    ? SqlSession 中执行了任何一个 update 操作(update()、delete()、insert()) ,都会清空PerpetualCache 对象的数据,但是该对象可以继续使用。
 
 
 
  如何判断两次查询是完全相同的查询
    
    Mybatis 认为,对于两次查询,如果以下条件都完全一样,那么就认为它们是完全相同的两次查询。
      ? 传入的 statementId。
      ? 查询时要求的结果集中的结果范围。
      ? 这次查询所产生的最终要传递给 Preparedstatement 的 Sql 语句字符串。
      ? 传递的参数值
 
  测试一级缓存:
    
public class SelectUsersByIdCacheOneTest {
  public static void main(String[] args) {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UsersMapper usersMapper =sqlSession.getMapper(UsersMapper.class);
    Users users = usersMapper.selectUsersById(1);
    System.out.println(users);
    Users users2 = new Users();
    users2.setUsername("aaaa");
    users2.setUsersex("male");
    usersMapper.insertUsers(users);
    System.out.println("-----------------");
    Users users1 = usersMapper.selectUsersById(1);
    System.out.println(users1);
  }
}
  
 
 
2、二级缓存的使用:
  MyBatis 的二级缓存是 Application 级别的缓存,它可以提高对数据库查询的效率,以提  高应用的性能。二级缓存是 SqlSessionFactory 上的缓存,可以是由一个 SqlSessionFactory 创建的不同的 SqlSession 之间共享缓存数据。默认并不开启。
  SqlSession 在执行 commit()或者 close()的时候将数据放入到二级缓存。
 
技术分享图片

 

Sqlsession 共享二级缓存:
技术分享图片

 

   配置方式:

    二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis 要求缓存的 POJO 必须是可序列化的, 也就是要求实现 Serializable 接口。在映射配置文件中配置<cache/>就可以
开启缓存了。 
 
    特点:
      ? 映射语句文件中的所有 select 语句将会被缓存。
      ? 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
      ? 二级缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响
      ? 如果在加入<cache/>标签的前提下让个别 select 元素不使用缓存,可以使用 useCache属性,设置为 false。
      ? 缓存会使用默认的 Least Recently Used(LRU,最近最少使用的)算法来收回。
      ? 根据时间表,比如 No Flush Interval,(CNFI 没有刷新间隔),缓存不会以任何时间顺序来刷新。
      ? 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用
      ? 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全的被调用者修改,不干扰其他调用者或线程所做的潜在修改。
 
  
  cache 标签的可选属性:
    技术分享图片

 

 

 
 
 

Mybatis 缓存

原文:https://www.cnblogs.com/1and2/p/14156682.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!