mybatis的缓存机智

一整基于基于 SpringBoot+MyBatis实现的电商系统,前台商城系统+后台管理系统,手把手教你做商城项目(附学习源码) Github上有个大神开源了一个商城项目,现在有56.8k的star。 阅读详情

1.mybatis的缓存机制

1.1一级缓存:直观的理解就是某个sqlseesion的一个Map,结果用于存储一定数量的查询结果,在sqlseesion进行更新,删除操作时,mybatis会清空一级缓存,保持数据的一致性。值得注意的是mybatis与spring结合,一级缓存当sqlsession的事务提交了,spring将会关闭sqlseesion也就是将此sqlseesion的缓存清空。

1.2二级缓存:也就是某个mapper的一个Map,但是二级缓存不一定存在内存,而是多种存储介质,还可以是借助ehcache实现分布式存储。第一个sqlseesion查询了数据库之后,mybatis会进行缓存,当第二个sqlseesion 查询的时候首先会在mapper的缓存下,查询,没有再查询数据库。

2.使用

2.1一级缓存

//一级缓存一般不用管理,在你不知不觉下的就会使用了,使用代码,理解一级缓存的效果
@Controller
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private OrderMapper ordermapper;

    //事务管理
    @Autowired
    private DataSourceTransactionManager txManager;

    //事务定义
    @Autowired
    private DefaultTransactionDefinition txDefinition;

    @RequestMapping(value="/findorder",method=RequestMethod.GET)
    public String findOrderAndOrderDetail(HttpServletRequest request)
    {   
        //获取事务状态
        TransactionStatus status = txManager.getTransaction(txDefinition);

        Order order = ordermapper.findOrderAndOrderDetail();
        System.out.println(order.toString()+"这是订单一");
        Order order2 = ordermapper.findOrderAndOrderDetail();
        System.out.println(order2.toString()+"这是订单二");
        request.setAttribute("order", order);

        txManager.commit(status);
        return "order_detail";
    }


//进行页面访问之后控制台打印
/**
DEBUG [http-bio-8080-exec-11] - ==>  Preparing: SELECT orders.*, orderdetail.items_id, orderdetail.items_num FROM orders, orderdetail WHERE orderdetail.orders_id = orders.id AND orders.id=3 
DEBUG [http-bio-8080-exec-11] - ==> Parameters: 
DEBUG [http-bio-8080-exec-11] - <==      Total: 2
DEBUG [http-bio-8080-exec-11] - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3716e720]
com.ssm.model.Order@4fcd0175这是订单一
DEBUG [http-bio-8080-exec-11] - Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3716e720] from current transaction
DEBUG [http-bio-8080-exec-11] - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3716e720]
com.ssm.model.Order@4fcd0175这是订单二
**/

//此时就可以看查询order1的时候,由于没有缓存数据,边进行查询数据库,但是查询order2 的时候不再向数据库发送查询语句

2.2二级缓存

2.2.1在mybatis配置文件打开二级缓存开关

2.2.2在你需要开启二级缓存的mapper 下打开二级缓存开关

<mapper namespace="com.ssm.mapping.OrderMapper">
    <!-- 开启本mapper的二级缓存 -->
    <cache></cache>
    <!--这里还有关于二级缓存的众多选项,这里只做基础测试-->

2.2.3对pojo类进行实现序列化接口

public class Order implements Serializable

2.2.4使用


/**二级缓存是mapper级别的缓存,那么使用两次访问便可以看到效果,第一次进行查询sqlseesion关闭,mapper进行缓存,第二次查询则是另一个sqlseesion了,**/
@Controller
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private OrderMapper ordermapper;

    //事务管理
    @Autowired
    private DataSourceTransactionManager txManager;

    //事务定义
    @Autowired
    private DefaultTransactionDefinition txDefinition;

    @RequestMapping(value="/findorder",method=RequestMethod.GET)
    public String findOrderAndOrderDetail(HttpServletRequest request)
    {   
        //获取事务状态
        TransactionStatus status = txManager.getTransaction(txDefinition);

        Order order = ordermapper.findOrderAndOrderDetail();
        System.out.println(order.toString()+"这是订单一");

        request.setAttribute("order", order);

        txManager.commit(status);
        return "order_detail";
    }

2.2.5结果

**<!--这是第一次查询,可以看到Cache Hit Ratio缓存命中率0.0,向数据库发送了查询语句-->**
DEBUG [http-bio-8080-exec-12] - Creating a new SqlSession
DEBUG [http-bio-8080-exec-12] - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3a3b6630]
DEBUG [http-bio-8080-exec-12] - Cache Hit Ratio [com.ssm.mapping.OrderMapper]: 0.0
DEBUG [http-bio-8080-exec-12] - ==>  Preparing: SELECT orders.*, orderdetail.items_id, orderdetail.items_num FROM orders, orderdetail WHERE orderdetail.orders_id = orders.id AND orders.id=3 
DEBUG [http-bio-8080-exec-12] - ==> Parameters: 
DEBUG [http-bio-8080-exec-12] - <==      Total: 2
DEBUG [http-bio-8080-exec-12] - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3a3b6630]
com.ssm.model.Order@7b49a5a9这是订单一

**<!--这是第二次查询,可以看到Cache Hit Ratio缓存命中率0.5 并没有向数据库发送查询语句-->**
DEBUG [http-bio-8080-exec-8] - Creating a new SqlSession
DEBUG [http-bio-8080-exec-8] - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5382276e]
DEBUG [http-bio-8080-exec-8] - Cache Hit Ratio [com.ssm.mapping.OrderMapper]: 0.5
DEBUG [http-bio-8080-exec-8] - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5382276e]
com.ssm.model.Order@64b013a这是订单一

3. 对二级缓存的总结

3.1也就是说二级缓存是mapper级别的,可以供不同的session使用,二级缓存有其的缺陷,比如说sqlseesion1向数据库查询了多次不同的数据,mybatis进行缓存多次的查询数据,sqlseesion2也如此,那么当sqlseesion1进行对一个数据的update,delete操作时,二级缓存就需要清空所有缓存保持数据一致性,那么sqlseesion2的缓存也被清除掉了,也就是二级缓存对数据的细粒度不够友好

5.Mybatis 缓存详解 本节主要介绍一级缓存使用、二级缓存的使用、一级缓存源码分析、二级缓存的源码分析 阅读详情

相关推荐

ArcGIS小白必看:5分钟搞定面要素转点要素+自动计算经纬度坐标(附常见报错解决方案)

本文为ArcGIS新手详细解析了面要素转点要素并自动计算经纬度坐标的完整流程。核心在于正确理解和使用坐标系,并掌握ArcToolbox中的“要素转点”等工具。文章深入剖析了常见报错(如坐标系未定义、字段计算失败)的根源,提供了从基础操作到Python脚本自动化的实战解决方案,确保数据转换的准确与高效。

weixin_29284885的博客 575

Spring整合MyBatis导致一级缓存失效问题

Spring整合MyBatis导致一级缓存失效问题

lixianhe的博客 1万+

基于FPGA的函数信号发生器设计

设计采用波形查找表和相位累加器的方法实现DDS,查找表的数据位宽为8位,采样点数为4096。波形产生范围是100Hz-20MHz,最小频率间隔为1Hz,用8个数码管显示频率,可产生正弦波、方波、三角波,波形用两个led显示,select信号控制,全灭为正弦波,一亮一灭为方波,全亮为锯齿波。为了使频率和相位便于调节,用3个拨码开关控制步进,用8个led显示状态。

FPGA入门到跑路 5636

Spring结合mybatis时一级缓存失效问题

Spring结合mybatis时一级缓存失效问题 之前了解到mybatis的一级缓存是默认开启的,作用域是sqlSession,是基 HashMap的本地缓存。不同的SqlSession之间的缓存数据区域互不影响。当进行insert、update、delete操作后并且commit事物到数据库之后,sqlSession中的Cache自动被清空 可以通过以下两种方式关闭  1.sql级别 ...

潘建南的博客 1714

Windows下快速搭建MSYS2开发环境(含GCC与MinGW配置)

本文详细介绍了在Windows系统下快速搭建MSYS2开发环境的完整流程。通过使用pacman包管理器,可以便捷地安装GCC编译器与MinGW-w64工具链,并配置系统环境变量。文章还涵盖了从基础安装、系统更新到编译开源项目的实战指南,帮助开发者高效构建原生Windows程序,显著提升C/C++开发效率。

weixin_29213827的博客 540

薛定谔 | 先导化合物优化与相互作用可视化

当获得针对某个靶点的先导分子后,想要在此基础上进行化学结构修饰。为了提升化学改造的成功率可以采用本教程方法进行结构虚拟改造/优化。每用薛定谔处理一个新任务,第一步必须创建新的project以方便日后管理。选项卡中修改工作路径(可以方便地找到输出文件)

药研猿的博客 2145

MyBatis重复查询产生的一级缓存问题,导致查询失败

MyBatis重复查询产生的缓存问题,导致查询失败

weixin_46643875的博客 3734

基于FSL的DTI数据预处理流程

最近在学习处理DTI数据,总结了一份应用FSL做DTI数据预处理的流程与大家交流交流。如果有错误的地方欢迎大家指正!        我用的数据是Philips的数据,如果是GE或者西门子的数据可能会有所不同。   原始数据:包括3DT1数据和高分辨率DTI数据,均是dicom格式。 工具:MRICRON和FSL,所有的命令均在Linux的终端中运行。   1.格式转换:将后缀名为dcm

zaza_zaza的博客 2万+

SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@xxx] was not registered for synchro

Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4218520b] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@affeb4e] wil

AVATAR 3万+

Minitab田口设计实战:如何用正交试验优化遗传算法参数(附完整操作步骤)

本文详细介绍了如何利用Minitab田口设计进行遗传算法参数优化,通过正交试验方法显著提升效率。文章涵盖实验设计、Minitab操作步骤、结果分析及高级技巧,帮助工程师快速掌握这一工业级优化技术,实现算法性能的显著提升。

wind6的博客 866

数据分析案例-对某宝用户评论做情感分析

目录 原始数据 绘制词云图 情感分析 原始数据 原始数据为某宝一商品的用户评论数据 绘制词云图 # coding=utf-8 import jieba import re import wordcloud import imageio # 打开需要分析词频的文本 with open('淘宝评论3.0.txt', encoding='utf-8') as f: data = f.read() # 文本预处理 :去除一些无用的字符只提取出中文出来 new_data

m0_64336780的博客 1万+

java mybatis缓存机制_MyBatis缓存机制的设计与实现

本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论。MyBatis将数据缓存设计成两级结构,分为一级缓存、二级缓存:一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存。一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持...

weixin_42581003的博客 406

实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理

探讨如何基于实现一个高效的上下文管理组件,以解决多线程环境下的数据共享和上下文管理这些问题。通过具体的代码示例和实战展示如何为多线程编程提供一种简洁而高效的上下文管理方案。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 11万+

mybatis源码_[源码]mybatis一级缓存源码分析

一. 为什么要有一级缓存 每当我们使用Mybatis开启一次和数据库的会话, 就会创建一个SqlSession对象来表示这个会话。就在这一次会话中, 我们有可能反复执行完全相同的查询语句, 这些相同的查询语句在没有执行过更新的情况下返回的结果也是一致的。相信机智的你已经想到, 如果每次都去和数据库进行交互查询的话, 就会造成资源浪费。 所以, mybatis加入了一级缓存, 用来在一次会话中缓存...

weixin_39706441的博客 57

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

1.[源码]mybatis一级缓存源码分析

一. 为什么要有一级缓存   每当我们使用Mybatis开启一次和数据库的会话, 就会创建一个SqlSession对象来表示这个会话。就在这一次会话中, 我们有可能反复执行完全相同的查询语句, 这些相同的查询语句在没有执行过更新的情况下返回的结果也是一致的。相信机智的你已经想到, 如果每次都去和数据库进行交互查询的话, 就会造成资源浪费。 所以, mybatis加入了一级缓存, 用来在一次会话中缓存查询结果。   总结下一级缓存的存在起到的作用: 在同一个会话里面,多次执行相同的sql语句(stateme

uknowzxt的博客 221

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MyBatis(三) 事务管理和缓存机制

一、事务管理 1.1 Transaction接口 1、构成: (1)MyBatis的事务设计重点是Transaction接口,Transaction接口有两个实现类,分别是 JdbcTransaction和ManagedTransaction。 (2)同时MyBatis还设计了TransactionFactory接口和两个实现类JdbcTransanctionFactory和Managed

java那些事儿 3369

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

基于机智云平台与SSM框架构建可扩展的物联网群体管理系统

物联网技术通过传感器网络实现物理世界的数字化感知,其核心原理是将各类终端设备接入云端,进行数据汇聚、解析与智能处理。这项技术的价值在于能够将传统依赖人工的密集型管理工作自动化、智能化,从而显著提升运营效率与响应速度。在智慧宿舍、养老监护、资产跟踪等群体管理场景中,海量设备接入、数据协议解析与业务逻辑开发是常见的工程挑战。借助机智云这类AIoT开发平台,开发者可以快速完成设备接入与数据云端化,而将开发重心聚焦于核心业务。本文以SSM(Spring+SpringMVC+MyBatis)框架构建业务后端为例,详细

weixin_30561177的博客 327

Mybatis详解

1.优点:①不屏蔽Sql,可以对sql进行优化和改造            ②提供强大,灵活的映射机智。提供动态Sql.            ③在mybatis中,提供了使用Mapper的接口编程。只要一个接口和一个Xml就能创建映射器。2.组件:SqlSessionFactoryBuilder(构造器):会根据配置文件或者代码生产SqlSessionFactory,采用的是分步构建的Build...

qq_39141360的博客 403

互联网大厂Java面试实录:Spring Boot自动配置、JVM内存、Redis缓存穿透与一致性、MyBatis、Kafka、微服务注册中心与K8s——谢飞机历险记

某互联网大厂会议室,玻璃墙外是行色匆匆的程序员。面试官老张面无表情地翻着简历,对面坐着谢飞机——polo衫塞进军规西装裤,头发用发胶固定成“高可用”形态,胸前工牌歪歪扭扭写着“资深研发·谢飞机”。老张放下简历,清了清嗓子:“先自我介绍一下吧。”谢飞机“噌”地站起来:“我叫谢飞机,会写Java,能修电脑,还能帮领导抢红包!”老张嘴角抽了一下:“坐下吧,我们开始。

2602_95996092的博客 161

Spring Boot 2+MyBatis+Docker+Elasticsearch微服务商城源码分享

mall学习教程,架构、业务、技术要点全方位解析。mall项目是一套电商系统,使用现阶段主流技术实现。涵盖了SpringBoot2.1.3、MyBatis3.4.6、Elasticsearch6.2.2、RabbitMQ3.7.15、Redis5.0、Mongodb4.2.5、Mysql5.7等技术,采用Docker容器化部署。(附带全套Spring Cloud教程,有需要的小伙伴在文末查看免费领取方式。

jjc4261的博客 917

mybaits事务管理

1、构成: (1)MyBatis的事务设计重点是Transaction接口,Transaction接口有两个实现类,分别是 JdbcTransaction和ManagedTransaction。 (2)同时MyBatis还设计了TransactionFactory接口和两个实现类JdbcTransanctionFactory和ManagedTransactionFactory。 2...

闪的博客 220

【课程设计】SSM仓库管理系统毕业设计-附源码061015

SSM仓库管理系统的主要使用者分为管理员、和用户,实现功能包括:首页、用户管理(管理员、用户)、更多管理(商品库存管理、入库申请管理、出库申请管理、过户申请管理、仓库费用管理等)由于本网站的功能模块设计比较全面,所以使得整个仓库管理系统的过程得以完善。本系统的使用可以实现仓库管理的信息化,可以方便管理员进行更加方便快捷的管理,可以提高仓库管理的管理效率。 关键词:MYSQL数据库;仓库管理;SSM框架......

Biye_Design的博客 5560

互联网大厂Java面试实录与技术深度解析:高并发电商场景的面试官对话与业务代码

面试岗位:Java后端开发工程师场景:电商平台高并发订单处理与支付风控系统技术栈:Java 11, Spring Boot, MyBatis, Redis缓存, RabbitMQ消息队列, Spring Security, Docker, Kubernetes特殊业务:涉及用户订单实时处理、库存同步、支付安全风控本次面试围绕电商订单系统的设计展开,从Java语言基础、Spring Boot开发、数据库事务、缓存及消息队列,再到安全框架,逐步深入,贴合真实业务场景。

haru_tempus的博客 1303

springboot整合elasticsearch_Spring Boot 2+MyBatis+Docker+Elasticsearch微服务商城源码分享

项目介绍mall学习教程,架构、业务、技术要点全方位解析。mall项目是一套电商系统,使用现阶段主流技术实现。涵盖了SpringBoot2.1.3、MyBatis3.4.6、Elasticsearch6.2.2、RabbitMQ3.7.15、Redis5.0、Mongodb4.2.5、Mysql5.7等技术,采用Docker容器化部署。(附带全套Spring Cloud教程)组织结构mall├──...

weixin_39627201的博客 253
上一篇: spring手动事务
下一篇: struts2表单验证
cst_code
博客等级 码龄10年 4粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值