【MySQL进阶之路】SpringBoot 底层如何去和 MySQL 交互了呢?

news/2024/5/19 1:22:42 标签: MySQL, SpringBoot交互, TCP连接, Druid连接池, JDBC

在这里插入图片描述

MySQL__1">SpringBoot 底层如何去和 MySQL 交互了呢?

我们在写做 Java 项目时,一般都是引入 MyBatis 框架来和 MySQL 数据库交互,如果需要在 MySQL 上执行什么语句,只需要在 Mapper.xml 文件中定义对应的 SQL 语句即可

那么他底层到底是如何将定义在 Mapper.xml 文件中的 SQL 语句拿到 MySQL 中执行的呢?

其实 SpringBoot 项目底层就是通过和 MySQL 建立网络连接,之后通过这个连接来进行通信的

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

那么要建立和 MySQL 之间的连接,就要在项目中引入 MySQL 连接的 JDBC(Java Database Connectivity) 驱动JDBC 就提供了 Java 程序和 MySQL 进行交互的接口

我们在 Java Web 刚入门的时候应该就学习了 JDBC,而在 MyBatis 中也是对 JDBC 进行了封装和抽象,提供了更丰富的功能给我们使用,先来看一下下边这张图,来详细说一下 SpringBoot 与 MySQL 如何进行交互:

请添加图片描述

用户发起一次 HTTP 请求的流程:

先从用户端说起,当用户对 SpringBoot 系统发起一个 HTTP 请求时,Tomcat 会创建一个线程来处理用户的请求,这个线程通过 JDBC 驱动来和数据库建立网络连接,将需要执行的 SQL 语句发送给 MySQL 数据库,MySQL 收到 SQL 之后执行语句,并将结果通过网络连接返回给 Tomcat 中的线程,最终再经过业务逻辑的处理,返回给用户

JDBC 驱动会为每一个线程都创建一个数据库连接吗?

上边说到了工作线程要和 MySQL 进行通信,就要建立一个数据库连接

那么假想一下如果对每一个线程都建立一个数据库连接,这里建立的连接是 TCP 连接,光建立连接就需要 3 次握手(3 次网络 IO),并且在使用完进行销毁,那么带来的性能开销是相当庞大的

基于这个问题,就引入了 数据库连接池,像我们常用的连接池就是 Druid 数据库连接池(阿里巴巴开源)

通过连接池,可以集中管理一批数据库连接,来供多个线程使用,使用完不销毁,再放回连接池可以进行复用,这样就省去了不断创建连接以及销毁连接的性能开销

在 Druid 连接池中维护了多个与 MySQL 的数据库连接,因此在 MySQL 中也是会有对应的连接池用于管理和外部的连接的,这里就省略不画了,只画了 Druid 中的连接池:

请添加图片描述


http://www.niftyadmin.cn/n/5374420.html

相关文章

【Docker】Docker Container(容器)

文章目录 一、什么是容器&#xff1f;二、为什么需要容器&#xff1f;三、容器的生命周期容器OOM容器异常退出容器暂停 四、容器命令详解docker createdocker logsdocker attachdocker execdocker startdocker stopdocker restartdocker killdocker topdocker statsdocker cont…

极限的唯一性推导

定义推导 根据函数的 y f ( x ) yf(x) yf(x)的定义,x∈集合A,y∈集合B,集合A对应B的关系是单射即一个x只能对应一个y。固 lim ⁡ x − > ∗ f ( x ) A \lim\limits_{x->*}f(x)A x−>∗lim​f(x)A存在,那么其极限必定唯一 反证法 函数 f ( x ) 存在极限 lim ⁡ x −…

烹饪第一个U-Net进行图像分割

今天我们将学习如何准备计算机视觉中最重要的网络之一&#xff1a;U-Net。如果你没有代码和数据集也没关系&#xff0c;可以分别通过下面两个链接进行访问&#xff1a; 代码&#xff1a; https://www.kaggle.com/datasets/mateuszbuda/lgg-mri-segmentation?sourcepost_page--…

倒计时56天

复习3-2&#xff1a;习题篇&#xff1a; 3. #include<bits/stdc.h> using namespace std; #define int long long const int N2e56; const int inf 0x3f3f3f3f; int a[1100][1100]; int b[1100][1100][4]; int n,m,q; int dfs(int i,int j,int q) {if(i<0||j<0||…

Postgres 和 MySQL 应该怎么选?

数据库选择指南&#xff1a;何时使用PostgreSQL&#xff0c;何时选择MySQL 在建设任何应用系统时&#xff0c;选择合适的数据库是一个关键决策点&#xff0c;它直接影响到系统的性能、可扩展性、可维护性以及未来的发展能力。 PostgreSQL&#xff08;简称Postgres&#xff09;…

猫头虎分享已解决Bug || ValueError: Data cardinality is ambiguous

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

伦敦金交易平台:了解交易背后的世界

伦敦金交易平台是全球金融市场中备受关注的重要平台之一。作为国际金融中心&#xff0c;伦敦汇聚了众多金融机构和投资者&#xff0c;其金交所成为全球最大的现货黄金市场。在这个繁荣蓬勃的市场中&#xff0c;交易活跃&#xff0c;投资机会多样&#xff0c;吸引了众多投资者前…

CSP-动态规划-最长公共子序列(LCS)

一、动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;主要用于求解可以被分解为相似子问题的复杂问题&#xff0c;特别是在优化问题上表现出色&#xff0c;如最短路径、最大子数组和、编辑距离等。动态规划的核心思想是将原问题分解为较小的子…