Mybatis缓存1----系统缓存及简单配置介绍

 

mybatis缓存

  系统缓存:常用的一级缓存和二级缓存

一级缓存

  一级缓存是SqlSession级别的缓存,在操作数据库时需要构建SqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。也就是只能作用在一个SqlSession对象中,不同SqlSession之间的缓存数据是互相不能读取的。

   一级缓存的工作原理

  

  口述介绍:

  当用户A发起请求查询一条记录时,SqlSession会先从缓存中读取数据,如果存在就读取,如果不存在就从数据库获取数据。

  SqlSession执行commit操作时,会清空一级缓存。这么做是为了避免脏读。

  

  注:如果commit不清空缓存,会出现错误。例如:当用户A查询某件商品还有10件,并将10件商品缓存在一级缓存中,之后被客户买走10件,数据被delete掉,但下次查询这件商品是从缓存中获取。就会出现脏数据。

  spring中整合的mybatis

  spring将事务放在Service中管理,对于每一个service中的SqlSession是不同的,这是通过mybatis-spring中的org.spring.mapper.MapperScannerConfigurer创建SqlSession自动注入到Service中的,每次查询之后都要关闭SqlSession,关闭之后数据会被清空,所以spring整合之后如果没有事务支持,一级缓存是没有意义的。

  二级缓存

    二级缓存的工作原理

  

    口述介绍:

    二级缓存是mapper级别的缓存,多个sql‘Session去操作同一个mapper的sql语句,多个SqlSession可共用同一个二级缓存,二级缓存是跨SqlSession的。

   每一个mapper都有一个二级缓存区域(按照namespace区分),每一个namespace的mapper都有二级缓存区域,两个mapper的namespace相同,这两个mapper执行的Sql查询数据存储在同一个二级缓存区域。

    

   开启二级缓存

    1.打开总开关:

    在mybatis的xml文件中加入:

    <settings>

      <setting name="cacheEnabled" value="true"/>

    <settings/>

    2.在需要开启二级缓存的mapper.xml文件中引入<cache />

    3.让使用二级缓存的POJO类实现Serializable(序列化)接口

    注:springboot中默认开启了全局二级缓存,如果使用二级缓存需要在mapper上注明。@CacheNamespace

    总结:

    好处:对于查询多,commit操作少的。用户对查询条件实时性数据要求不高,采用二级缓存可以降低数据库访问量,提高数据库访问性能。

    弊端:二级缓存是建立在一个namespace下的,如果是多个namespace那么数据可能是错误的。

      

     举例说明:

    部门和部门员工,部门存储在部门的二级缓存下,部门员工存储在部门员工的二级缓存下。如果有人对部门信息进行修改,那么影响的就只有部门的二级缓存,如果在进行查询时,部门员工信息时从部门员工的二级缓存中获取的。这时候的数据是已经过时的。

    使用二级缓存的问题:

    对该表的操作都是同一个namespace下,其他namespace如果有操作就会发生脏读。

    对关联表的操作,关联表的所有表的操作都必须在同一个namespace下操作。

原文地址:https://www.cnblogs.com/shar-wang/p/11614173.html

时间: 2024-11-09 02:16:57

Mybatis缓存1----系统缓存及简单配置介绍的相关文章

Mybatis缓存(1)--------系统缓存及简单配置介绍

前言 Mybatis的缓存主要有两种: 系统缓存,也就是我们一级缓存与二级缓存: 自定义的缓存,比如Redis.Enhance等,需要额外的单独配置与实现,具体日后主要学习介绍. 在这里主要记录系统缓存的一些简单概念, 并没有涉及原理.其中会涉及Mybatis的相关配置以及生命周期等. 主要参考资料:<深入浅出Mybatis基础原理与实战>,http://www.mybatis.org/mybatis-3/zh/index.html 1.Mybatis简单配置介绍 本文介绍的是基于XML的配置

【缓存】系统缓存全解析 (上)

有时候总听到网友说网站运行好慢,不知如何是好:有时候也总见到一些朋友写的网站功能看起来非常好,但访问性能却极其的差.没有"勤俭节约"的意识,势必会造成"铺张浪费".如何应对这种情况,充分利用系统缓存则是首要之道. 系统缓存有什么好处呢?举个简单的例子,你想通过网页查询某些数据,而这些数据并非实时变化,或者变化的时间是有期限的.例如查询一些历史数据.那么每个用户每次查的数据都是一样的.如果不设置缓存,ASP.NET也会根据每个用户的请求重复查询n次,这就增加了不必要的

【缓存】系统缓存全解析 (下)

6.数据库缓存依赖 更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能.但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据就是老的数据,从而导致数据的不一致.那有没有办法做到,数据如果不变化,用户就一直从缓存中取数据,一旦数据变化,系统能自动更新缓存中的数据,从而让用户得到更好的用户体验. 答案是肯定的!.NET已经为我们提供了这样一种非常好的解决方法:SqlCacheDependency数据库缓存

【缓存】系统缓存全解析 (中)

4.应用程序数据缓存 System.Web.Caching 命名空间提供用于缓存服务器上常用数据的类.此命名空间包括 Cache 类,该类是一个字典,您可以在其中存储任意数据对象,如哈希表和数据集.它还为这些对象提供了失效功能,并为您提供了添加和移除这些对象的方法.您还可以添加依赖于其他文件或缓存项的对象,并在从 Cache 对象中移除对象时执行回调以通知应用程序. 隐藏行号 复制代码 ? protected void Page_Load(object sender, EventArgs e)

【信号与系统】1.简单概念介绍

信号与系统的模型:抓住主要矛盾,简化复杂的细节. 信号是什么? 系统输入输出的物理量,例如电路输出的电压或电流都是信号.信号是人为定义的,是人最关心的东西.通常来讲这些物理量都是时间的函数,因此信号本质上也是一个函数. 通常来讲输入为一种人为可控制的物理量,输出是输入经过系统后得到物理量. 系统是什么? 系统就是把复杂的东西抽象成只关心输入信号和输出信号的黑盒. 信号与系统的例子 下面是一个弹簧重物系统,其中弹簧的上端是可移动的.输入信号X为上端移动到的位置,输出信号y为重物的位置.这就构成了一

memcached数据库简单配置介绍

一.memcached数据库(基于内存的储存方式:默认端口11211)1.装包yum -y install memcached telnet (telnet是一款远程访问工具,mem软件无客户端,所以需安装telnet连接服务器)2.启服务:systemctl restart memcached.server查看端口是否启用:netstat -antpu | grep mem3.查看配置文件(默认不需要修改):vim /etc/sysconfig/memcached 4.连接数据库验证是否可用:

centos7防火墙的简单配置介绍

centos7版本 1.查看已开放的端口(默认不开放任何端口) firewall-cmd --list-ports 2.开启80端口 firewall-cmd --zone=public(作用域) --add-port=80/tcp(端口和访问类型) --permanent(永久生效) 3.重启防火墙 firewall-cmd --reload 4.停止防火墙 systemctl stop firewalld.service 5.禁止防火墙开机启动 systemctl disable firew

C#系统缓存全解析

原文:http://blog.csdn.net/wyxhd2008/article/details/8076105 目录(?)[-] 系统缓存全解析1系统缓存的概述 系统缓存全解析2页面输出缓存 系统缓存全解析3页面局部缓存 系统缓存全解析5文件缓存依赖 系统缓存全解析6数据库缓存依赖 统缓存全解析7第三方分布式缓存解决方案 Memcached和Cacheman 系统缓存有什么好处呢?举个简单的例子,你想通过网页查询某些数据,而这些数据并非实时变化,或者变化的时间是有期限的.例如查询一些历史数据

C# ASP.NET系统缓存全解析

原文:http://blog.csdn.net/wyxhd2008/article/details/8076105 目录(?)[-] 系统缓存全解析1系统缓存的概述 系统缓存全解析2页面输出缓存 系统缓存全解析3页面局部缓存 系统缓存全解析5文件缓存依赖 系统缓存全解析6数据库缓存依赖 统缓存全解析7第三方分布式缓存解决方案 Memcached和Cacheman 系统缓存有什么好处呢?举个简单的例子,你想通过网页查询某些数据,而这些数据并非实时变化,或者变化的时间是有期限的.例如查询一些历史数据