连接池是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)连接池能够对连接进行灵活的管理,对连接池配置与连接池状态监控,看到连接池里面的各种连接数量和性能指标。
(二)连接池架构
连接池架构分为:接口层、核心层、基础层。
接口层
:对于MyBatis是从连接池里获取连接,连接用完之后关闭,调用连接的Close,归还连接。
核心层
:负责并发控制、连接控制、异常处理。
1)并发控制:连接池里的连接数量有限,应用里面的线程数量多于连接池的连接数量。
第一种情况,当连接池里的连接都处于活跃状态时,下一个请求,想要继续得到连接需要等待,因为数量有限,需要排队。
第二种情况,同一个链接,不能分配给多个线程,否则可能会事务混乱。
2)连接控制:需要能够动态调整连接池大小,同时连接池保证连接池里面的连接数量在期望范围内。
3)异常处理:出现异常时,比如底层数据库重启,网络中断,或者连接里面发生了协议层引擎层面错误,连接已经
不能再使用,这个时候连接池自动处理这些问题,将连接关闭并重新创建链接。
基础层
:包括配置管理、监控、定时任务、日志、字节码操纵。
1)配置管理:连接池里面有很多的配置项,虽然常用的不多,但是可配置的点很多,需要进行解析管理。
2)监控:连接运行时需要统计和监控,最好能够提供查看的页面。
3)定时任务:连接池里空闲连接数量超过一定的程度,释放空闲连接,是通过定时任务完成。
4)字节码操纵:在Java框架里面会存在大量的字节码操纵,动态生成代理。
参考:
https://developer.aliyun.com/ebook/450?spm=a2c6h.20345107.ebook-index.28.6eb21f54J7SUYc