Mybatis的一级缓存

引子:
在现在的网络中,缓存是一个很重要的概念如果没有缓存机制的话,非常影响数据的读取效率,那么mybatis有吗,当然有啦,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的二级缓存(一)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭