带着问题来一起学MySQL
- MySQL驱动到底是什么东西?
- 数据库连接池到底是用来干什么的?
1.1 MySQL驱动到底是什么东西?
我们都知道,一个Java系统要想去访问MySQL数据库,必须在Java系统中引入MySQL驱动依赖,有了这个MySQL驱动才能跟MySQL数据库建立连接,然后执行各种各样的SQL语句。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency>
mysql-connector-java 是MySQL提供的JDBC驱动包,用JDBC连接MySQL数据库时必须使用该jar包,它的主要用途有三个:
- 与数据库建立连接
- 发送 SQL 语句
- 处理结果
1.2 数据库连接池到底是用来干什么的?
先思考一个问题:一个Java系统跟数据库是否只建立一个连接?
答案是显而易见的:不行!假设我们用Java开发了一个Web系统,是部署在Tomcat中的,那么Tomcat本身肯定是有多个线程来并发的处理同时接收到的多个请求的。
这时,如果Tomcat中的多个线程并发处理多个请求的时候,都要去抢夺一个连接去访问数据库的话,那效率肯定是很低下的。
再思考一个问题:如果Tomcat中的每个线程在每次访问数据库的时候,都基于MySQL驱动去创建一个数据库连接,然后执行SQL语句,然后执行完之后再销毁这个数据库连接,这样行不行呢?
在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源,Java程序则要把代表连接的java.sql.Connection对象等加载到内存中,所以建立数据库连接的开销很大。尤其是在大量的并发访问时,假如某网站一天的访问量是10万,那么,该网站的服务器就需要创建、断开连接10万次,频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。
为了避免频繁地创建数据库连接,工程师们提出了数据库连接池技术。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用现有的数据库连接,而不是重新建立。
从图中可以看出,数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,当应用程序访问数据库时并不是直接创建Connection,而是向连接池“申请”一个Connection。如果连接池中有空闲的Connection,则将其返回,否则创建新的Connection。使用完毕后,连接池会将该Connection回收,并交付其他的线程使用,以减少创建和断开数据库连接的次数,提高数据库的访问效率。