数据库连接池
传统的数据库连接:
Class.forName("com.mysql.jdbc.Driver");
String name = "root";
String password = "123";
String url = "jdbc:mysql://127.0.0.1:3306/mydb";
Connection conn = DriverManager.getConnection(url, name, password);
传统的JDBC访问数据库技术,每次访问数据库都需要通过数据库驱动器Driver和数据库名称以及密码等资源建立数据库连接。
这样的连接存在两大问题:
- 频繁的建立数据库连接与断开连接数据库,会消耗大量的资源和时间,降低性能;
- 数据库的连接需要用户名和密码等等,这些需要一定的内存和CPU开销;
Mysql的通讯协议是基于TCP传输协议的,建立连接的过程:
- 建立TCP连接,通过三次握手实现;
- 服务器发送客服端握手信息,客户端响应该握手信息
- 客服端发送认证包,用于用户验证,验证成功后,服务器返回OK响应,之后开始执行命令。
用户验证成功之后,会进行一些连接变量的设置,比如字符集、是否自动提交事务等,期间会有多次数据的交互。
整个数据库连接的交互可以看出,数据在客户端和服务器之间需要至少往返7次,从时间上来看大概建立一次连接就是200ms;
一般数据库连接的缺点:
- 网络IO较多
- 数据库的负载较高
- 响应时间较长及QPS较低
- 应用平凡的常见连接和关闭连接,导致临时对象较多,GC频繁
- 关闭连接后,会出现大量TIME_WAIT 的TCP状态(在2个MSL之后关闭)
连接池的工作原理:
-
连接池的建立
- 常见的连接池这里就不详细说了,连接池一般在系统初始化的时候,会根据配置文件中的配置属性进行建立,
创建连接对象
(连接数量)的过程在这里完成,
- 常见的连接池这里就不详细说了,连接池一般在系统初始化的时候,会根据配置文件中的配置属性进行建立,
-
连接池管理
-
数据库连接的管理肯定是池子的核心了,其有专门的管理策略:
当用户请求数据库连接时,首先查看池子中是否有空闲连接,如果存在空闲连接则将连接分配使用;如果没有空闲连接,则查看当前所开连接时是否已经达到了
最大连接数
,如果没有达到就重新创建一个连接给请求的用户;如果达到就按中设定的最大时间进行等待,如果超过最大等待时间
,则抛出异常给用户;(这里涉及到很多配置文件对数据库连接池的配置信息,后面讲连接池的时候在详细补充)
-
-
连接池的关闭
- 应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源。
数据库连接池种类
连接池详细的就不介绍了,常见的连接池主要有c3p0,DBCP,HikariCP,Druid;其中Druid实现了对数据源的监控功能,HikariCP是springboot2.x默认的使用的数据库连接池。
连接池常见配置:
参数 | 描述 | 默认值 | 解释 |
---|---|---|---|
connectionTimeout | 等待来自池的连接的最大毫秒数 | 30000 | 如果小于250毫秒,则被重置回30秒 |
idleTimeout | 连接允许在池中闲置的最长时间 | 600000 | 如果idleTimeout+1秒>maxLifetime 且 maxLifetime>0,则会被重置为0(代表永远不会退出);如果idleTimeout!=0且小于10秒,则会被重置为10秒 |
maxLifetime | 池中连接最长生命周期 | 1800000 | 如果不等于0且小于30秒则会被重置回30分钟 |
minimumIdle | 池中维护的最小空闲连接数 | 10 | minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize |
maximumPoolSize | 池中最大连接数,包括闲置和使用中的连接 | 10 | 如果maxPoolSize小于1,则会被重置。当minIdle<=0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle>0则重置为minIdle的值 |
推荐文章:https://blog.csdn.net/qq_36528311/article/details/87264571