程序员眼中的数据库
平时在我们写Java系统时,一般会连接到一个MySQL数据库上,执行各种增删改查。在实际使用过程中,遇到一些死锁、SQL性能太差、异常错误等,就只会网上博客,尝试着捣鼓一下,最后可能解决了问题,但是也没有最终搞明白原理。
这里我现在就系统的学习MySQL底层技术原理,如何基于MySQL原理去解决排查问题。
MySQL的驱动
在使用Java代码连接MySQL数据库时,我们都需要在系统的依赖中加入一个数据库驱动。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
MySQL驱动会负责与MySQL数据库建立网络连接,如下图 当有了网络连接后,Java代码才能够访问数据库进行增删改查。
对于不同的语言,MySQL会提供不同的语言版本的MySQL驱动程序,让不同的语言程序可以访问MySQL数据库。
数据库连接池的作用
一个Java程序只会创建一个数据库连接吗?
这个肯定不是的,可以假想在tomcat中,tomcat本身是有多个线程来同时处理多个任务请求的,如下图
但如果多个任务抢夺一个数据库连接访问数据库的话,那效果肯定是不行的。
那么如果每个任务都创建一个数据库连接访问,那么tomcat中上百个线程频繁创建数据库连接,执行SQL之后频繁销毁连接,这样效率肯定是低下的。
所以一般情况下我们需要使用一个数据库连接池,也就是在一个池子里维护多个连接,让多个线程使用不同的连接访问数据库,执行SQL之后不销毁连接,然后再放回到连接池中,后续还可以使用。
基于这样的一个数据库连接池的机制,就可以解决多个线程并发的使用多个数据库连接去执行SQL语句的问题,而且还避免了数据库连接使用完之后就销毁的问题。
MySQL数据库连接池有什么用
我们再把目光转移到MySQL中,MySQL肯定也会与多个系统建立连接,那么MySQL也需要维护与各个系统的连接,所以MySQL架构中的第一个环节就是连接池。
如下图,实际上MySQL中的连接池就是维护了与系统之间的多个数据库连接。除此之外,你的系统每次跟MySQL建立连接的时候,还会根据你传递过来的账号和密码,进行账号密码的验证,库表权限的验证。
小节
今天从数据库驱动联想到连接池,再到MySQL架构中的连接池,由知识的对照学习,逐渐加深印象。