Mybatis的一级缓存

原创 2018年04月17日 21:49:56

引子:
在现在的网络中,缓存是一个很重要的概念如果没有缓存机制的话,非常影响数据的读取效率,那么mybatis有吗,当然有啦,mybatis中有两种缓存一种时一级缓存,一种是二级缓存。先来讲一讲一级缓存

一级缓存
首先一级缓存是mybatis的自动的缓存,即不需要开启也不能关闭,但我们可以人为的清除一级缓存。其次一级缓存的域只针对一个session对象,不同的session之间的一级缓存无法共享。最后当我们在进行数据的变更操作时,mybatis会自动的清除内部缓存.下面我们先通过源码直观的看看mybatis的一级缓存到底是怎样的:
这里写图片描述
这个方法是BaseExecutor里的执行方法(SimpleExecutor、ReuseExecutor、BatchExecutor三个基本执行器都是继承于该类,在openSession中不指定执行器类型默认为SimpleExecutor),在执行器里有一个localCache对象(PerpetualCache类)而这个对象便是保存维护一级缓存的地方,如果在里面有相应的数据那么同一个session执行相同的sql语句时执行器便不会从数据库中查询而是返回缓存里的结果.
可以看到如果list=null时调用的方法便是从数据库里找数据(key是CacheKey类由BaseExecutor中的createCacheKey创建,其中利用传入各种对象算出哈希来保证唯一性,这里以后再讨论),我们可以看一看这个方法:
这里写图片描述
可以看到当我们查询成功后,查询结果便会放到这个localCache中,以便执行同样的sql语句时快速返回数据。
(ps:PerpetualCache的对象创建是在BaseExecutor中而这个执行器创建是在SqlsessionFactory创建session时创建的并放入session中的,这也就说明为什么session之间时无法共享一级缓存)


说了这么多还是来看看在使用一级缓存时的样子吧:

public static void main(String[] args) {
        SqlSession session =factory.openSession();

        BbsuserMapper bbsuserMapper1 = session.getMapper(BbsuserMapper.class);

        Bbsuser bbsuser = new Bbsuser();
                bbsuser.setName("张三");
        bbsuser.setPassword("123");
        System.out.println("===========缓存和懒加载机制=====================");     
        Bbsuser bbsusers = bbsuserMapper1.searchBbuser(bbsuser);

        System.out.println("==========懒加载=============");
        System.out.println(bbsusers);
        System.out.println("======一级缓存========");
         bbsusers = bbsuserMapper1.searchBbuser(bbsuser);
        System.out.println(bbsusers);
         session.clearCache();
         session.commit();
         session.close();
 }

因为前面已经说明了一级缓存的概念这里我就直接把结果发出来:
这里写图片描述
这里还设计了一个懒加载方式,从localCache里面还可以看到懒加载的结果也会保存到其中(就不贴图了)。可以看到最终的结果中并没有连接数据库获取数据而是直接通过缓存里得到。

再来说说缓存的清除:缓存的清除有两种方式:第一种是mybatis的自发行为当我们用session执行了数据更改等操作时会自动清空它,第二种便是我们调用Session的clearCache()方法,这里就不在赘述了.

最后再来说说一级缓存的性能分析:
从一级缓存的存储方式就可以看出,如果频繁的使用SqlSession进行不同的查询的话,一级缓存会越来越大,占用较多的内存空间,不过既然是SqlSession其生命周期一般也比较短,同时session只要执行了update,insert,delete的话便会清除缓存。但为了保证数据的一致性,session的生命周期最好不要太长,否则其中的缓存数据很可能过期

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq87034246/article/details/79981481

Mybatis快速入门

mybatis已是主流持久层框架,目前学习资料和书籍是最少的,本课程针对实际企业应用,进行mybatis技术解析。
  • 2016年10月27日 09:27

MyBatis的一级缓存实现详解 及使用注意事项

MyBatis的一级缓存实现详解 及使用注意事项
  • u012621115
  • u012621115
  • 2016-03-28 15:57:11
  • 2512

Mybatis一级缓存

一、建一个普通java项目, 项目目录如下: 添加jar包如下: junit-4.10.jar log4j-1.2.16.jar mybatis-3.1.1.jar mysql-connector...
  • cq1982
  • cq1982
  • 2015-05-09 17:45:23
  • 4242

mybatis的一级缓存实现原理

0.写在前面         MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上。MyBatis提供了一级缓存、二级缓存 这两个缓存机制,能够很好地处...
  • AILAN_
  • AILAN_
  • 2015-10-23 16:53:03
  • 1573

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

mybatis学习笔记(13)-查询缓存之一级缓存 标签: mybatis mybatis学习笔记13-查询缓存之一级缓存 查询缓存一级缓存 一级缓存工作原理一级缓存测试一级缓存应用 ...
  • zhousenshan
  • zhousenshan
  • 2016-03-01 23:40:54
  • 595

MyBatis如何禁用掉一级缓存。

一级缓存:同一个sqlsession里面存在,缓存用map存储。       key:sqlsession.hashcode+statementId+sql value:查询出来的对象。 ...
  • qq_19550657
  • qq_19550657
  • 2016-12-15 16:23:16
  • 4585

Mybatis的一级缓存和二级缓存机制

一级缓存的应用(自动开启,创建Sqlsession) 正式开发,是将mybatis和spring进行成和开发,事务控制在service中。一个service方法中包括很多mapper方法的调用。 ...
  • shaoduo
  • shaoduo
  • 2017-04-14 22:02:43
  • 925

mybatis一级缓存(session cache)引发的问题

mybatis一级缓存(session cache)引发的问题
  • flysharkym
  • flysharkym
  • 2016-05-14 12:06:21
  • 5208

【MyBatis】查询缓存(一级缓存和二级缓存)

一级缓存:是SQlSession级别的缓存。在操作数据库时需要构造SqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的SqlSession之间的缓存数据区域(Ha...
  • u013036274
  • u013036274
  • 2017-02-27 14:01:56
  • 2567

《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项

MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上。MyBatis提供了一级缓存、二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能。本...
  • u010349169
  • u010349169
  • 2014-11-21 23:01:28
  • 28503
收藏助手
不良信息举报
您举报文章:Mybatis的一级缓存
举报原因:
原因补充:

(最多只允许输入30个字)