你的系统是如何跟MySQL打交道的

1、Java 工程师眼中的数据库是什么东西?


从今天开始,我们将要开始一个MySQL的专栏,一起来研究MySQL数据库的底层原理和各种实践案例,以及互联网公司的技术方案。


现在我们先来看看,在一个Java工程师眼中的数据库是什么东西?
平时我们在做Java系统时,一般情况下都会连接到一个MVSQL数据库上去,执行各种增删改查的语句。


据我所知,目前行业里大部分的Java工程师对MVSQL的了解和掌握程度,大致就停留在这么一个阶段:对MVSQL可以建库建表建索引,然后就是执行增删改查去更新和查询里面的数据!
所以我们看下面的图,很多Java工程师眼中的数据库大致就是下面这样子。

但是实际在使用MySQL的过程中,大家总会遇到这样那样的一些问题,比如死锁异常、SQL性能太差、异常报错,等等。


很多Java工程师在遇到MySQL数据库的一些问题时,一般都会上网搜索博客,然后自己尝试捣鼓着解决一下,最后解决了问题,自己可能也没搞明自里面的原理。


因此我们就是要带着大家去探索MVSQL底层原理的方方面面,以及探索在解决MVSQL各种生产实战问题的时候,如何基于MySQL底层原理去进行分析、排查和定位。

2、MySQL驱动到底是什么东西?


大家都知道,我们如果要在Java系统中去访问一个MySQL数据库,必须得在系统的依赖中加入一个MySQL驱动,有了这个MySQL驱动才能跟MySQL数据库建立连接,然后执行各种各样的SQL语句。


那么这个MySQL驱动到底是个什么东西?
这段maven配置中就引入了一个MySQL驱动。这里的mysql-connector-java我们先来看下面的一段maven配置,就是面向Java语言的MySOL驱动。


大家都知道,如果我们要访问数据库,必须得跟数据库建立一个网络连接,那么这个连接由谁来建立呢?


其实答案就是这个MVSQL驱动,他会在底层跟数据库建立网络连接,有网络连接,接着才能去发送请求给数据 库服务器!我们看下图。

然后当我们跟数据库之间有了网络连接之后,我们的Java代码才能基于这个连接去执行各种各样的增删改查 SQL语句


我们看下图

所以对于Java语言开发的系统,MySQL会提供Java版本的MySQL驱动,对于PHP、Per1、.NET、Python、Ruby等各种常见的编程语言,MVSQL都会提供对应语言的MVSQL驱动、让各种语言编写的系统通过MVSOL驱 动去访问数据库。


3. 数据库连接池到底是用来干什么的?


接着我们来思考一个问题,一个Java系统难道只会跟数据库建立一个连接吗?


这个肯定是不行的,因为我们要明白一个道理,假设我们用Java开发了一个Web 系统,是部署在Tomcat中的,那么Tomcat本身肯定是有多个线程来并发的处理同时接收到的多个请求的,我们看下图。


这个时候,如果Tomcat中的多个线程并发处理多个请求的时候,都要去抢夺一个连接去访问数据库的话,那效率肯定是很低下的


我们看下面的图

那么如果Tomcat中的每个线程在每次访问数据库的时候,都基于MySQL驱动去创建一个数据库连接,然后执行SQL语句,然后执行完之后再销毁这个数据库连接,这样行不行呢?


可能Tomcat中上百个线程会并发的频繁创建数据库连接,执行SQL语句,然后频繁的销毁数据库连接。上述这个过程反复循环构行,大家觉得可行吗?


这也是非常不好的,因为每次建立一个数据库连接都很耗时,好不容易建立好了连接,执行完了SQL 语句,你 还把数据库连接给销毁了,下一次再重新建立数据库连接,那肯定是效率很低下的!如下图。

所以一般我们必须要使用一个数据库连接池,也就是说在一个池子里维持多个数据库连接,让多个线程使用里 面的不同的数据库连接去执行SQL语句,然后执行完SQL语句之后,不要销毁这个数据库连接,而是把连接放 回池子里,后续还可以继续使用。


基于这样的一个数据库连接池的机制,就可以解决多个线程并发的使用多个数据库连接去执行SQL语句的问题。


而且还避免了数据库连接使用完之后就销毁的问题,我们看下图的说明。

常见的数据库连接池有DBCP,C3PO,Druid,等等,大家如果有兴趣的话,可以去搜索一下数据库连接池的 使用例子和代码,甚至探索一下数据库连接池的底层原理,但这个不是我们专栏的重点,我们就不会拓展了。


毕竟我们专栏主要还是会专注讲解MVSQL数据库本身的内容,只不过在开头的时候,需要大家对Java系统与数 据库的交互方式有一个了解。


其实不光是Java系统,如果你是一个Python、Ruby、NET、PHP 的程序员,这个系统与数据库的交互本质都 是一样的,都是基于数据库连接池去与数据库进行交互。


4.数据库的连接池是用来干什么的?


现在我们已经知道,我们任何一个系统都会有一个数据库连接池去访问数据库,也就是说这个系统会有多个数 据库连接,供多线程并发的使用。同时我们可能会有多个系统同时去访问一个数据库,这都是有可能的。
所以当我们把目光转移到MVSQL的时候,我们要来思考一个问题,那就是肯定会有很多系统要与MVSQL数据库建立很多个连接,那么MySQL也必然要维护与系统之间的多个连接,所以MySQL架构体系中的第一个环节,就是连接池。
我们看下面的图,实际上MySQL中的连接池就是维护了与系统之间的多个数据库连接。除此之外,你的系统每次跟MVSQL建立连接的时候,还会根据你传递过来的账号和密码,进行账号密码的验证,库表权限的验证。

5、小作业:自己试一试写代码建立MySQL连接


当我们看完今天的内容后,大家可以用自己工作中经常使用的编程语言,来写一下跟MVSQL建立连接的代码,想必写完之后,再对照今天的内容,感受会更深一些。


另外,大家可以基于数据库连接池框架,去写一下对应的代码例子,感受一下你建立多个数据库连接让多个线 程并发访问数据库的效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mp3怎样才能转换成wav格式?音频互相转换的方法

一,什么是WAV WAV,全称为波形音频文件(Waveform Audio File Format),是一种由微软公司和IBM公司联合开发的音频文件格式。自1991年问世以来,WAV格式因其无损的音频质量和广泛的兼容性,成为了多…

【C++】1390-请从键盘读入一个四位整数,求这个四位整数各个位的和是多少?

问题:1390-请从键盘读入一个四位整数,求这个四位整数各个位的和是多少? 类型:基础问题 题目描述: 请从键盘读入一个四位整数,求这个四位整数各个位的和是多少? 输入: 一个四位整…

thinkphp6入门(23)-- 如何导入excel

1. 安装phpexcel composer require phpoffice/phpexcel composer update 2. 前端 <form class"forms-sample" action"../../xxxx/xxxx/do_import_users" method"post" enctype"multipart/form-data"><div class"cont…

再写-全景拼接

全景拼接 1. 将读取进行灰度转化&#xff0c;并且输出图像&#xff0c;关键点和计算描述 import cv2 import numpy as np# 将读取进行灰度转化&#xff0c;并且输出图像&#xff0c;关键点和计算描述 image_left cv2.imread("C:\\Users\\HONOR\\Desktop\\image\\pinjie…

Day19-【Java SE进阶】网络编程

一、网络编程 1.概述 可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。java.net,*包下提供了网络编程的解决方案! 基本的通信架构 基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)。 网络通信的…

轮腿机器人-五连杆正运动学解算

轮腿机器人-五连杆与VMC 1.五连杆正运动学分析2.参考文献 1.五连杆正运动学分析 如图所示为五连杆结构图&#xff0c;其中A&#xff0c;E为机器人腿部控制的两个电机&#xff0c;θ1,θ4可以通过电机的编码器测得。五连杆控制任务主要关注机构末端C点位置&#xff0c;其位置用直…

【Unity】常见性能优化

1 前言 本文将介绍下常用的Unity自带的常用优化工具&#xff0c;并介绍部分常用优化方法。都是比较基础的内容。 2 界面 2.1 Statistics窗口 可以简单查看Unity运行时的统计数据&#xff0c;当前一帧的性能数据。 2.1.1 Audio 音频相关内容。 Level&#xff1a;音量大小&a…

物联网云组态平台

TopStack 物联网云组态平台&#xff0c;提供从边缘感知及设备到云的数据采集、分析、可视化软件服务&#xff0c;提供完善的平台开发环境&#xff0c;协助客户完善垂直领域的业务应用开发。与伙伴共同打造多元产业物联网解决方案。 产品采用微前端、微服务架构进行设计&#x…

Testng测试框架(7)--测试运行

忽略测试 TestNG可以让你忽略类、特殊包、包及其子中的所有Test方法。 当在测试方法级别使用Ignore 注解&#xff0c;在功能上与Test(enabledfalse).一样。 以下例子将忽略类中所有tests。 import org.testng.annotations.Ignore; import org.testng.annotations.Test; Ign…

day9 | 栈与队列 part-1 (Go) | 232 用栈实现队列、225 用队列实现栈

今日任务 栈与队列的理论基础 (介绍:代码随想录)232 用栈实现队列(题目: . - 力扣&#xff08;LeetCode&#xff09;)225 用队列实现栈 (题目: . - 力扣&#xff08;LeetCode&#xff09; ) 栈与队列的理论基础 栈 : 先进后出 队列: 后进先出 老师给的讲解:代码随想录 …

left join limit offset 分页查询问题

1. LEFT JOIN 简介 在开始讨论LEFT JOIN的使用方法之前&#xff0c;让我们先简要回顾一下LEFT JOIN的概念。 LEFT JOIN是一种用于将左表和右表连接起来的操作。它会返回左表中的所有记录&#xff0c;并且对于每条左表记录&#xff0c;如果在右表中找到符合条件的记录&#xf…

js+网络摄像头实现人体肢体关键点动作捕获

最近有一个项目&#xff0c;客户需要用户人体姿势识别&#xff0c;进行表演考核用途&#xff0c;或者康复中心用户恢复护理考核&#xff0c;需要用摄像头进行人体四肢进行肢体关键点对比考核&#xff0c;资料还是太少了。只有个别大佬发了部分技术指导。感觉写的不错。 阿里云…

算法第四十一天-排除排序链表中的重复元素Ⅱ

排除排序链表中的重复元素Ⅱ 题目要求 解题思路 题意&#xff1a;在一个有序链表中&#xff0c;如果一个节点的值出现不止一次&#xff0c;那么把这个节点删除掉 重点&#xff1a;有序链表&#xff0c;所以&#xff0c;一个节点的值出现不止一次&#xff0c;那么他们必相邻。…

CMC学习系列 (7):β 范围 EEG-EMG 相干性与皮质光谱功率有关

CMC学习系列:β 范围 EEG-EMG 相干性与皮质光谱功率有关 0. 引言1. 主要贡献2. 方法2.1 目标2.2 实验范式2.3 数据处理和分析 3. 结果4. 讨论5. 总结欢迎来稿 论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1053811907001760 论文题目&#xff…

一、接口自动化之pytest 运行参数

1、在跟目录下创建一个配置项pytest.ini [pytest] testpaths./testcases markersp0:高于优先级test:测试环境pro:生成环境2、打标签 3、运行命名pytest -m "p0"

单链表详解(无哨兵位),实现增删改查

1.顺序表对比单链表的缺点 中间或头部插入时&#xff0c;需要移动数据再插入&#xff0c;如果数据庞大会导致效率降低每次增容就需要申请空间&#xff0c;而且需要拷贝数据&#xff0c;释放旧空间增容造成浪费&#xff0c;因为一般都是以2倍增容 2.链表的基础知识 链表也是线…

蓝桥杯 — — 数数

数数 友情链接&#xff1a;数数 题目&#xff1a; 思路&#xff1a; 这道题目主要用到了埃氏筛法&#xff08;Sieve of Eratosthenes&#xff09;来快速求解质数的方法&#xff0c;思路很巧妙&#xff0c;并且用到了动态规划的思想。 我们首先定义两个数组mk和p&#xff0c…

LPA3399Pro搭建Qt开发环境

将以前的开发文档在此做一个记录。 一、介绍 Qt是一个跨平台的应用程序开发框架&#xff0c;支持多种操作系统和硬件架构&#xff0c;包括ARM架构的Linux。 RK3399Pro是一款基于ARM架构的处理器&#xff0c;用于嵌入式系统。可以在RK3399上搭建Qt开发环境&#xff0c;进行项目…

C语言学习笔记之结构体(一)

目录 什么是结构体&#xff1f; 结构体的声明 结构体变量的定义和初始化 结构体成员的访问 结构体传参 什么是结构体&#xff1f; 在现实生活中的很多事物无法用单一类型的变量就能描述清楚&#xff0c;如&#xff1a;描述一个学生&#xff0c;需要姓名&#xff0c;年龄&a…

演示:单包攻击,扫描类攻击,畸形报文攻击[Land攻击,泪滴攻击,ip地址欺骗]。配置防火墙进行防御

浏览上篇博客进行环境搭建 单包攻击 单包攻击&#xff08;Single Packet Attack&#xff09;是一种利用网络协议或应用程序中的漏洞进行的攻击方式。这种攻击通常只需要发送一个精心构造的数据包&#xff0c;就能够触发目标系统的漏洞&#xff0c;导致攻击者能够执行非授权的…