Mybatis配置代码解读(事务管理与连接池)

目录

配置代码解读

事务管理方式

数据库连接池 

测试代码解读

SqlSessionFactory

SqlSession

接口的代理对象


▐ 前言

在上一篇文章 手把手教你搭建Mybatis框架-CSDN博客 中分享了如何搭建Mybatis框架,但没有对一些配置文件和语法做出详细解读,刚开始学习的小白们可能会有很多不理解的代码,所以本篇文章会详细解读Mybatis配置代码和相关语法,更进一步的认识和学习Mybatis!

配置代码解读

在Mybaits核心配置文件中有这么一行代码:<transactionManager type="JDBC"/>

它表示事务管理方式,“transactionManager”表示事务管理器,“type="JDBC"”指定了事务管理器的类型为 JDBC,意味着将使用基于 JDBC 提供的机制和接口来管理事务,那么接下来就说说什么是事务管理?

事务管理方式

 •  简单讲,事务管理就是一次对数据库操作过程中,执行多条sql的管理。

 •  事务只针对新增,修改,删除操作,查询是不需要提交事务的。

 •  当执行一系列数据库操作时,JDBC事务管理器会确保要么所有操作都成功提交,要么在出现错误时全部回滚,以保证数据的完整性和一致性。

 •  例如生活中的转账操作,要从A账户向B账户转200元,那么就需要向数据库发送2条sql

    sql1:A账户 -200                                   ①

    其它代码(可能出现异常)                    ②

    sql2:B账号 +200                                  ③

当JDBC把sql代码发送给数据库时,此时不会立刻执行,而是把所有操作都成功执行完后再提交事务

若每执行一条sql就提交一次事务,那么如果①成功执行,②出现异常,导致③没有执行,但由于①成功执行后提交了事务,会出现A账号-200,B账户没有+200的情况!

▐ JDBC 事务管理器的工作原理是什么?

在 Java 中,JDBC 事务管理器的工作原理主要包括以下几个关键步骤:

1. 开启事务
通过调用 Connection 对象的 setAutoCommit(false) 方法来开启一个事务。这意味着后续的数据库操作不会自动提交,而是由开发者手动控制提交或回滚。

2. 执行数据库操作
在事务范围内执行一系列的 SQL 语句,如插入、更新、删除等操作。

3. 决定提交或回滚
如果所有操作都成功完成,并且希望将这些操作的结果永久保存到数据库中,就调用 Connection 对象的 commit() 方法来提交事务。

例如,如果在一个电商应用中,用户下单后需要同时更新库存和创建订单记录,只有这两个操作都成功,才提交事务。

如果在执行数据库操作过程中出现了异常或错误,或者由于业务逻辑的需要,决定取消这些操作对数据库的影响,就调用 Connection 对象的 rollback() 方法来回滚事务。

比如,在转账操作中,如果从一个账户扣除金额成功,但向另一个账户添加金额失败,就回滚整个事务,以保证数据的一致性。

4. 恢复自动提交模式(可选)
在事务完成后,如果希望后续的数据库操作恢复自动提交模式,可以调用 Connection 对象的 setAutoCommit(true) 方法。

总之,JDBC 事务管理器通过控制事务的开启、操作执行、提交或回滚,来保证数据库操作的原子性、一致性、隔离性和持久性。


在Mybaits核心配置文件中有这么一行代码:<dataSource type="POOLED">

它表示数据库连接池,用于定义数据源的类型为 “ 池化(POOLED)” ,那么接下来就说说什么是数据库连接池?

数据库连接池 

池,也就是一个集合,起缓存作用,由于频繁的创建销毁与数据库的连接对象是比较占用时间和空间的,所以可以在一个集合(池子)中默认创建若干个连接对象(默认是10),有请求使用时,直接从连接池中取出一个对象,用完之后归还,减少了创建和销毁的时间开销。

这种方式的优点包括:

  1. 提高性能:避免了频繁创建和关闭数据库连接的开销,从而加快了应用程序的响应速度。
  2. 资源有效利用:通过复用连接,能够更有效地利用系统资源。

例如,在一个高并发的 Web 应用中,如果没有使用池化数据源,每次请求都创建新连接,可能会导致数据库连接资源耗尽,系统性能下降。而使用池化数据源,如 <dataSource type="POOLED"> 配置,可以有效地应对大量并发请求,保证系统的稳定和高效运行。

再比如,在一个企业级的业务系统中,大量的短时间数据库操作频繁发生,池化数据源能够显著减少连接创建和关闭的时间,提高整体的处理效率。

▐ 配置 POOLED 数据源时,通常需要设置哪些参数?

1. 数据库驱动类
指定用于连接数据库的驱动程序类的全限定名,例如 com.mysql.jdbc.Driver 。

2. 数据库 URL
包含数据库服务器的地址、端口、数据库名称等信息,例如 jdbc:mysql://localhost:3306/mydatabase 。

3. 用户名和密码
用于登录数据库的认证信息。

4. 初始连接数
指定连接池在初始化时创建的连接数量。

5. 最大连接数
设定连接池能够创建的最大连接数量,防止过多的连接导致资源耗尽。

6. 最小空闲连接数
确保连接池中始终保持的最少空闲连接数量。

7. 连接超时时间
定义获取连接的等待超时时间,避免长时间阻塞。

8. 空闲连接回收时间
设置空闲连接在多长时间未被使用后将被回收。

<dataSource type="POOLED"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="123456"/><property name="initialSize" value="5"/><property name="maxTotal" value="20"/><property name="minIdle" value="3"/><property name="maxWaitMillis" value="5000"/><property name="timeBetweenEvictionRunsMillis" value="60000"/>
</dataSource>

测试代码解读

SqlSessionFactory

通过Mybatis核心文件的配置,Mybatis框架能够创建出 SqlSessionFactory 对象,SqlSessionFactory是用来创建SqlSession对象的,通过SqlSession 来执行数据库操作,如查询、插入、更新和删除等。

在一个大型的企业级应用中,可能会有多个不同的数据源配置,通过创建多个 SqlSessionFactory 来分别处理不同数据库的操作。

SqlSession

SqlSession对象是与数据库交互的,每次与数据库连接都需要创建一个新的连接对象,用完关闭即可,是Mybatis中进行数据库操作的关键接口,通过它可以方便地执行各种数据库操作并管理资源。

接口的代理对象

接口的代理对象是一种编程技术,常见的实现方式有静态代理和动态代理,由于接口是不能创建对象的,这里是通过接口的代理对象调用接口中对应方法所匹配的sql

接口的代理对象在很多场景中都非常有用,比如日志记录、权限控制、事务处理等。 



  本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

海漫浩浩,我亦苦作舟!大家一起学习,一起进步!     Mybatis系列持续创造和更新中...

推荐文章:

手把手教你搭建Mybatis框架-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/2301_79263365/article/details/140454624?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/382028.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费【2024】springboot 必录德健身器材用品网的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

maven私服上传jar包 400 Bad Request 错误

文章目录 前言一、直接看报错二、问题处理三 maven 私服配置说明总结 前言 maven仓库的私服,一般会存放公司或者个人封装的jar包,用来共享给二次开发和协作伙伴用,很方便 第一次发布没有问题,但是我第二次发布,开始报错了 一、直接看报错 401 无权限我这个是400 说明用户名密…

Sql Server缓冲池、连接池等基本知识(附Demo)

目录 前言1. 缓存池2. 连接池3. 彩蛋 前言 基本的知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;Mysql优化高级篇&#xff08;全&#xff09;Mysql底层原理详细剖析常见面试题&#xff08;全&#xff09; 1…

昇思25天学习打卡营第14天|计算机视觉

昇思25天学习打卡营第14天 文章目录 昇思25天学习打卡营第14天FCN图像语义分割语义分割模型简介网络特点数据处理数据预处理数据加载训练集可视化 网络构建网络流程 训练准备导入VGG-16部分预训练权重损失函数自定义评价指标 Metrics 模型训练模型评估模型推理总结引用 打卡记录…

Atom - hackmyvm

简介 靶机名称&#xff1a;Atom 难度&#xff1a;简单 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmAtom 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;Atom&#xff09;&#xff1a;192.168.56.101 跳板机IP(windows 11)&#xff1…

Linux之基础IO(上)

目录 库函数文件操作 写文件 读文件 系统调用文件操作 写文件 读文件 文件描述符fd 深刻理解linux下一切皆文件 重定向原理 在c语言中我们学习了fopen&#xff0c;fread&#xff0c;fwrite接口&#xff0c;用于进行文件相关的操作&#xff0c;在之前我们学习了计算…

科普文:银行信贷系统概叙

信贷业务流程 资金需求者提交申请&#xff1a;资金需求者通过不同渠道&#xff08;如APP、网站、门店等&#xff09;提交贷款申请。 系统交互完成审批&#xff1a;系统通过自动化和人工相结合的方式&#xff0c;对贷款申请进行初步筛选和审批。 系统交互完成策略判断&#xf…

AFAC2024-基于保险条款的问答 比赛日记 llamafactory qwen npu 910B1

AFAC2024: 基于保险条款的问答挑战——我的实战日记 概述 在最近的AFAC2024竞赛中&#xff0c;我参与了基于保险条款的问答赛道。这是一次深度学习与自然语言处理的实战演练&#xff0c;旨在提升模型在复杂保险文本理解与问答生成方面的能力。本文将分享我的参赛过程&#xf…

秒杀优化: 记录一次bug排查

现象 做一人一单的时候&#xff0c;为了提升性能&#xff0c;需要将原来的业务改造成Lua脚本加Stream流的方式实现异步秒杀。 代码改造完成&#xff0c;使用Jmeter进行并发测试&#xff0c;发现redis中的数据和预期相同&#xff0c;库存减1&#xff0c;该用户也成功添加了进去…

【Linux】Linux的基本使用

一.Linux的背景知识. 1.1什么是Linux Linux是一种开源的类Unix操作系统内核. 和Windows是" 并列 "的关系. 1.2Linux的发行版本. Linux 严格意义来说只是一个 “操作系统内核”.一个完整的操作系统 操作系统内核 配套的应用程序. 由于 Linux 是一个完全开源免费…

C++:格式化输入和输出、非格式化输入和输出(控制布尔值格式、整型值格式、浮点数格式;单字节操作put和get、多字节操作getline等)

1、格式化输入和输出 (1)What 标准库定义了一组操纵符&#xff08;本质是函数或对象&#xff09;来修改流的格式状态 当操作符改变流的格式状态时&#xff0c;通常改变后的状态对所有后续 IO 都生效 (2)Which A.控制布尔值的格式 bool bFlag true; std::cout<<std::b…

HTML+CSS3网页字符下雨特效

HTMLCSS3网页字符下雨特效https://www.bootstrapmb.com/item/14952 要在HTML和CSS3中创建一个字符下雨的特效&#xff0c;我们需要使用HTML来构建基本结构&#xff0c;然后使用CSS3的动画和关键帧&#xff08;keyframes&#xff09;来创建动画效果。但请注意&#xff0c;CSS3本…

pdf的下载,后端返回工作流,前端进行转换

前端将后端返回的工作流进行转换 项目中接触到了pdf的下载和预览的功能&#xff0c;记录一下~ 这里pdf的下载和预览的接口&#xff0c;后端返回的数据结构与其他的接口返回的数据结构有点不同&#xff0c;是直接返回的工作流&#xff0c;在控制台接口的响应预览内容大致是这样…

Aquila优化算法(基本原理+matlab源代码)—— 基于Aquila Optimizer原始论文分析

Matlab源代码位于&#xff1a; Aquila Optimizer: A meta-heuristic optimization algorithm - File Exchange - MATLAB Central (mathworks.cn) 1 Aquila优化算法 AO是一种基于种群优化方法&#xff0c;受启发于Aquila捕获猎物的方式。Aquila捕获猎物的方式主要有四种&#x…

JVM常用工具中jmap实现手动进行堆转储(heap dump文件)并使用MAT(Memory Analyzer Tool)进行堆分析-内存消耗分析

场景 JVM-常用工具(jps、jstat、jinfo、jmap、jhat、jstack、jconsole、jvisualvm)使用&#xff1a; JVM-常用工具(jps、jstat、jinfo、jmap、jhat、jstack、jconsole、jvisualvm)使用_jvm分析工具-CSDN博客 上面讲了jmap的简单使用。 下面记录其常用功能&#xff0c;实现堆…

【瑞芯微RV1126(板端摄像头图像数据采集)】②使用v4l2视频设备驱动框架采集图像数据

RV1126开发板&#xff1a;使用v4l2视频设备驱动框架采集图像数据 前言一、按键二、LCD显示三、V4L2 摄像头应用编程四、完整代码 前言 本系列的目的是&#xff0c;不仅仅将能够进行图片推理的模型部署于板端&#xff0c;还提供了两种摄像头数据采集的方法&#xff0c;集成到自…

国际化技术参考

一、概述 国际化就是用户可以选择对应的语言,页面展示成对应的语言; 一个系统的国际化按照信息的所在位置,可以分为三种国际化信息: 前端页面信息后端提示信息数据库的字典类信息二、前端页面国际化 使用i18n库实现国际化 i18n国际化库思路:通过jquery或者dom操作拿到需…

15现代循环神经网络—GRU与LSTM

目录 1.门控循环单元 GRU关注一个序列门候选隐状态(candidate hidden state)隐状态总结从零开始代码实现代码简洁实现2.长短期记忆网络 LSTM门候选记忆单元(candidate memory cell)记忆单元隐状态代码1.门控循环单元 GRU GRU 是最近几年提出来的,在 LSTM 之后,是一个稍微简…

Spring Boot + Spring Cloud 入门

运行配置 java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.activetest --my1.age32 --debugtrue "D:\Program Files\Redis\redis-server.exe" D:\Program Files\Redis\redis.windows.conf "D:\Program Files\Redis\redis-cli.exe" &q…

开源安全态势感知平台Security Onion

简介 Security Onion是一款由安全防御人员为安全防御人员构建的免费开放平台。它包括网络可见性、主机可见性、入侵检测蜜罐、日志管理和案例管理等功能。详细信息可以查看官网Security Onion Solutions 在网络可见性方面&#xff0c;Security Onion提供了基于签名的检测&…