连接池是MySQL数据库访问的关键组件,它负责管理和维护一组数据库连接,允许应用程序高效地重用这些连接,从而降低了连接的建立和断开开销,提高了性能、资源利用率和可伸缩性。

(一)为什么要用连接池?

不用连接池

连接池

建连接较耗时(两层握手)

性能更佳

连接数有限

连接数受控+健康探测

大量TIME_WAIT

监控和管理灵活

不用连接池会存在以下问题:

1)如果不用连接池,每一次查询都需要建立连接,有两层握手。第一层是TCP层的握手,第二层是 MySQL协议握手。

两层协议大概需要有多个TCP数据包,这些都需要时间,在数据库内部还需要处理,建立连接是费时间的操作;

2)对于当代的应用来说,应用服务器一般有很多台,而数据库服务器相比之下可能少一些。大量应用服务器会存在一个

问题,在业务流量高峰期存在对DB的连接,而DB能够承载的连接数有限。所以说如果不用连接池,那么这个连接的数

量就不受控制,严重情况下可导致DB性能降低;

3)如果不用连接池,意味着每次执行SQL语句时,都需要创建TCL链接和关闭TCL链接,而关闭动作是在应用端完成,

导致应用服务器上存在较多TimeWait状态的TCP连接。TimeWait状态的连接数达到一定数量之后会引起应用问题,例

如端口不够用。

用连接池的优点:

1)不用每次都建立连接,而是直接从连接池里取连接,性能更佳;

2)连接池可以控制连接数量,以及当连接出现问题时,连接池能够去自动探测连接是否存活,如果连接中断,连接池会

自动重建;

比如应用使用RDS的MySQL,需要对MySQL的实例进行配置变更。如升规格,提高磁盘空间,遇到问题者压力大时,

希望能够重启MySQL,有了连接池就能够自动处理好这些问题。

3)连接池能够对连接进行灵活的管理,对连接池配置与连接池状态监控,看到连接池里面的各种连接数量和性能指标。

(二)连接池架构

FastAPI mysql sqlalchemy 连接池 mysql连接池作用_mysql

连接池架构分为:接口层、核心层、基础层。

接口层:对于MyBatis是从连接池里获取连接,连接用完之后关闭,调用连接的Close,归还连接。

核心层:负责并发控制、连接控制、异常处理。

1)并发控制:连接池里的连接数量有限,应用里面的线程数量多于连接池的连接数量。

第一种情况,当连接池里的连接都处于活跃状态时,下一个请求,想要继续得到连接需要等待,因为数量有限,需要排队。

第二种情况,同一个链接,不能分配给多个线程,否则可能会事务混乱。

2)连接控制:需要能够动态调整连接池大小,同时连接池保证连接池里面的连接数量在期望范围内。

3)异常处理:出现异常时,比如底层数据库重启,网络中断,或者连接里面发生了协议层引擎层面错误,连接已经

不能再使用,这个时候连接池自动处理这些问题,将连接关闭并重新创建链接。

基础层:包括配置管理、监控、定时任务、日志、字节码操纵。

1)配置管理:连接池里面有很多的配置项,虽然常用的不多,但是可配置的点很多,需要进行解析管理。

2)监控:连接运行时需要统计和监控,最好能够提供查看的页面。

3)定时任务:连接池里空闲连接数量超过一定的程度,释放空闲连接,是通过定时任务完成。

4)字节码操纵:在Java框架里面会存在大量的字节码操纵,动态生成代理。

参考:https://developer.aliyun.com/ebook/450?spm=a2c6h.20345107.ebook-index.28.6eb21f54J7SUYc