Mybatis学习笔记-一级缓存

参考:http://blog.csdn.net/luanlouis/article/details/41280959

Mybatis是一个小巧、强大的ORM框架,主要功能与Hibernate类似,但比Hibernate更加灵活,简单。

我们都知道,数据库操作是一个应用中比较耗费资源的一点,Mybatis作为最好用的orm框架,当然在这方面也做了优化,同样,与hibernate类似,mybatis也提供了一级缓存和二级缓存来提高数据访问层(Dao)的性能。

下面详细介绍一个mybatis的一级缓存。

  • 一级缓存简述及引入一级缓存的原因。

    在某些情况下,我们需要在一次连接上进行多次相同的查询(虽然现在没想起来这样的场景,但它确实存在),这就意味着需要进行多次数据库操作,但是,重点在于多次查询的结果是相同的,这样的多次查询既没有意义有占用资源(数据库查询是非常耗费系统资源的),mybatis为了解决这个问题,就引入了以及缓存。

    每次查询时,mybatis会在SqlSession中创建一块缓存区,将查询接环缓存到这里,若在此次连接中有相同的查询,则直接从一级缓存总获取查询结果,不需要查询数据库,从而提高了系统性能和响应速度。

  • mybatis中一级缓存的组织形式

    mybatis的一级缓存是SqlSession对象内的一块内存区域,由于SqlSession代表了一次数据库连接,下面来看一下一级缓存与SqlSession的关系

    实际上,SqlSession只是mybatis对外提供的一个统一接口,对应执行sql语句的活儿都是交给Executor来处理的,这样一来,Executor顺理成章的维护一级Cache,图中的BaseExecutor是Executor的实现类,PerpetualCache是Cache接口的一个实现类。下面来看一下源代码就一目了然了。

public class DefaultSqlSession implements SqlSession {

      private Configuration configuration;
      //引入Executor
      private Executor executor;
      ......
}
public abstract class BaseExecutor implements Executor {

  private static final Log log = LogFactory.getLog(BaseExecutor.class);

  // for backward compatibility with 3.0 style logging
  private static final Log connectionLog = LogFactory.getLog(Connection.class);

  protected Transaction transaction;

  protected ConcurrentLinkedQueue<DeferredLoad> deferredLoads;
  //引入一级缓存
  protected PerpetualCache localCache;
  protected PerpetualCache localOutputParameterCache;
  protected Configuration configuration;

  protected int queryStack = 0;

  protected List<BatchResult> batchResults = new ArrayList<BatchResult>();
  private boolean closed;
}

小结,SqlSession包含Executor,Executor包含Cache。

  • 一级缓存的生命周期

    当SqlSession被创建时,一级缓存生命周期开始,当SqlSession被释放时,一级缓存生命周期结束。

    具体规则如下:

    a)调用SqlSession的close()方法,一级缓存被释放掉,一级缓存不可用。

    b)调用SqlSession的clearCache()方法,清空一级缓存,但一级缓存仍可用。

    c)执行DML的sql语句,会 清空缓存,但一级缓存可用。

  • 一级缓存的工作流程

    1)对于一个查询,根据statementId,params和rowBounds构建一个key

    2)根据这个key从cache(map)中获取数据。

    3)若结果不为空,则命中缓存,不再需要查询数据库。

    4)没有命中

    4.1)查询数据库,得到查询结果。

    4.2)将key和得到的查询结果(value)放入缓存中。

    4.3)返回结果。

  • 一级缓存的性能分析。

    a)mybatis的一级缓存是由map实现,相对简单,并且没有对容量的限制,那么这样会不会有由于map过大导致jvm内存溢出呢?mybatis这样设计当然有他的道理。

    a.1)一般来说,SqlSession对象不会存在太久,当执行完sql操作后就被释放掉了。

    a.2)只要执行DML操作,都会情况缓存。

    a.3)还可以手动清楚缓存中的内存(SqlSession的clearCache()方法)

b)mybatis的一级缓存是一个粗粒度的缓存,没有更新缓存和缓存过期等概念,所以在使用是,应该注意一下几点:

b.1)对于更新频率较大、且对数据准确性要求较高的,应尽量控制好SqlSession中一级缓存数据的存放时间,以免造成数据的误差。

b.2)对于频繁执行的大范围的select,尽量控制其结果在一级缓存中的存放时间,避免占用太多内存资源。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 01:29:27

Mybatis学习笔记-一级缓存的相关文章

Mybatis学习笔记-一级缓存与二级缓存

1.一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为session,当session被flush或close之后,该session中的所有Cache就将清空. 2.二级缓存与一级缓存机制相同,默认也采用PerpetualCache HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache. 3.对于缓存数据更新机制,当一个作用域(一级缓存session/二级缓存Namespace )进行了C/U/D操作后

Mybatis学习笔记-二级缓存

~ 缓存是提供应用系统性能的重要手段,前面已经介绍过Mybatis是一级缓存,与一级缓存不同的是,二级缓存的作用范围扩大到了应用级别,并且可以比一级缓存更细粒度的对二级缓存的应用进行配置.下面就详细叙述一下Mybatis的二级缓存实现. 二级缓存的工作流程 不多说,先上图,图解是攻城狮最好的朋友^_^- 前面在叙述一级缓存的时候已经说过,一级缓存是一块放在Executor中的map内存块.试想一下,如果二级缓存也是Executor中的内存块可以可以呢?-- 当然不可以!为啥?因为二级缓存要支持细

【MyBatis学习12】MyBatis中的一级缓存

缓存的作用是减轻数据库的压力,提高数据库的性能的.mybatis中提供了一级缓存和二级缓存,先来看一下两个缓存的示意图: 从图中可以看出: 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据.不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的. 二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级

mybatis学习笔记(13)-查询缓存之二级缓存

mybatis学习笔记(13)-查询缓存之二级缓存 mybatis学习笔记13-查询缓存之二级缓存 二级缓存原理 开启二级缓存 调用pojo类实现序列化接口 测试方法 useCache配置 刷新缓存就是清空缓存 应用场景和局限性 本文主要讲mybatis的二级缓存,二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的. 二级缓存原理 首先开启mybatis的二级缓存. sqlS

mybatis学习笔记(14)-查询缓存之中的一个级缓存

mybatis学习笔记(14)-查询缓存之中的一个级缓存 mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 本文主要讲mybatis的一级缓存.一级缓存是SqlSession级别的缓存. 查询缓存 mybatis提供查询缓存.用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时须要构造sqlSession对象,在对象中有一个数据结构(HashMa

MyBatis学习22-查询缓存-一级缓存

1.mybatis提供查询缓存,用于减轻数据压力,提高数据库性能.mybaits提供一级缓存,和二级缓存. 2.一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据.不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的.二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSe

springmvc+mybatis学习笔记(汇总)

springmvc+mybatis学习笔记(汇总) 标签 : springmvc mybaits springmvcmybatis学习笔记汇总 目录 联系作者 笔记分为两大部分:mybatis和springmvc mybatis springmvc 笔记内容主要是mybatis和springmvc的一些基本概念和使用方法,涉及概念介绍.环境搭建.编程细节.运行调试等方面. 这套笔记整体偏入门和应用,适合快速上手,对底层实现和机理并未做过多分析.我后续会研读spring源码,并把学习的收获写成博客

mybatis学习笔记(14)-mybatis整合ehcache

mybatis学习笔记(14)-mybatis整合ehcache mybatis学习笔记14-mybatis整合ehcache 分布缓存 整合方法掌握 整合ehcache 加入ehcache的配置文件 ehcache是一个分布式缓存框架 分布缓存 我们系统为了提高系统并发,性能.一般对系统进行分布式部署(集群部署方式) 不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发.所以要使用分布式缓存对缓存数据进行集中管理. mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合.

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但