zoukankan      html  css  js  c++  java
  • mybatis的一级缓存和二级缓存

    一级缓存和二级缓存都是数据库本身的功能,一级缓存是默认开始的,二级缓存是需要手动开启的。

    其实一级缓存和二级缓存并不是很好,因为当你关闭数据库的时候缓存就是自动清空,就没有redis数据库那么智能。

     

     

     

    一级缓存:

    一级缓存指的就是sqlsession,在sqlsession中有一个数据区域,是map结构,这个区域就是一级缓存区域。

    一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。

     

     

    第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。 得到用户信息,将用户信息存储到一级缓存中。 如果sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。 第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

    二级缓存:

    二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。

     

     

    所谓二级缓存其实就是 将相同的sql查询结果使用命名空间namespace分类存储而已,需要在不同的Mapper.xml文件中开启。

     

    二级缓存是mapper级别的。 第一次调用mapper下的SQL去查询用户信息。查询到的信息会存到该mapper对应的二级缓存区域内。 第二次调用相同namespace下的mapper映射文件中相同的SQL去查询用户信息。会去对应的二级缓存内取结果。 如果调用相同namespace下的mapper映射文件中的增删改SQL,并执行了commit操作。此时会清空该namespace下的二级缓存。

    如果关闭了sqlSession,但是由于是二级缓存,则依然会存入到内存中 再次进行相同Mapper文件的操作也会从缓存中获取到

    这里我要声明一下,我在使用二级缓存的时候,自定义了一个User的PO类,我运行查数据的时候,会报错

    这个错误就是告诉我们,你创建的User类没有实现序列化,

    什么是序列化? 将对象的状态信息转换为可以存储或传输的形式的过程,在序列化期间,对象将其当前状态写入到临时存储区或持久性存储区,之后,便可以通过从存储区中读取或反序列化对象的状态信息,来重新创建该对象

    什么情况下需要序列化? 当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化 例如将对象写入到本地文件中,通常也需要实现序列化

    由于二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样,所以需要给缓存的对象执行序列化。 如果该类存在父类,那么父类也要实现序列化。

  • 相关阅读:
    聊聊高并发系统之限流特技
    Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
    密码技术(图解密码技术的学习总结)
    Nginx配置
    Nginx与浏览器缓存
    JAVA类加载和初始化
    [TimLinux] JavaScript 模态框可拖动功能实现——节流版
    [TimLinux] JavaScript 模态框可拖动功能实现——原始版
    [TimLinux] Python3 Coverity zeep/SOAP 库使用示例
    [TimLinux] Vue.js -- Day02 -- 第一个示例
  • 原文地址:https://www.cnblogs.com/buwang/p/9967749.html
Copyright © 2011-2022 走看看