数据库连接池

数据库连接池

该文部分代码和内容节选自其他作者文章,仅用作个人学习,特此声明

链接:(1条消息) 数据库连接池学习笔记(一):原理介绍+常用连接池介绍_CrankZ的博客-CSDN博客_数据库连接池

1、学前了解

数据库连接 --> 执行完毕 --> 释放 --> 连接 --> 释放......

以上步骤十分浪费系统资源

池化技术:把一些能够复用的东西(比如说数据库连接、线程)放到池中,避免重复创建、销毁的开销,从而极大提高性能 [池化技术 - 云+社区 - 腾讯云 (tencent.com)](https://cloud.tencent.com/developer/article/1613322#:~:text=池化技术:把一些能够复用的东西(比如说数据库连接、线程)放到池中,避免重复创建、销毁的开销,从而极大提高性能。 在开发过程中我们会用到很多的连接池,像是数据库连接池、HTTP,连接池、 Redis 连接池等等。)

也就是说不用 JDBCUtils.getConnection() 了,直接拿到数据库连接

举个比较简单的例子,模拟一个营业场景

之前我们做的练习相当于下面这种营业方式

开门 --> 只服务一个人 --> 关门 --> 开门 --> 服务下一个人 --> 关闭......

很明显这个流程多了很多不必要的开门关门操作

我们稍微改进一下,也就是现实中的营业场景其实是这样的

开门 --> 营业员:等待客户 --> 服务客户 --> 等待下一个客户 --> ...... --> 不想营业的时候关门

池化技术的使用其实就类似于上边这种现实的营业场景

针对上面的例子,我们来仔细分析一下数据库连接池

现在应该对连接池有初步了解了,接下来我们正式进入数据库连接池的学习


2、传统连接与数据库连接池运行机制区别

2.1 不使用连接池

下面以访问MySQL为例,执行一个SQL命令,如果不使用连接池,需要经过哪些流程。

不使用数据库连接池的步骤:

1.TCP建立连接的三次握手
2.MySQL认证的三次握手
3.真正的SQL执行
4.MySQL的关闭
5.TCP的四次握手关闭

可以看到,为了执行一条SQL,却多了非常多我们不关心的网络交互

优点:
实现简单

缺点:
网络IO较多
数据库的负载较高
响应时间较长及QPS较低
应用频繁的创建连接和关闭连接,导致临时对象较多,GC频繁
在关闭连接后,会出现大量TIME_WAIT 的TCP状态(在2个MSL之后关闭)


2.2 使用连接池

使用连接池的步骤

第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。

优点

减少了网络开销

系统的性能会有一个实质的提升

没了麻烦的TIME_WAIT状态


3、连接池工作原理


4、连接池主要参数

在使用连接池之前,要配置一下参数

1.最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.

2.最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作

3.最大空闲时间

4.获取连接超时时间

5.超时重试连接次数


5、连接池注意点


6、DBCP-C3P0连接池

6.1 DBCP


6.2 C3P0




6.3 总结

无论用什么数据源,本质还是一样的,DataSource接口不会变,方法就不会变

其实可以不用像上面那样这么麻烦

直接用maven,以后再说~~

c3p0-0.9.5.5.jar下载及Maven、Gradle引入代码,pom文件及包内class -时代Java (nowjava.com)