mysql数据库为什么要使用连接池?

连接池是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用SQLAlchemy连接多个数据库使用连接池,你可以创建多个连接池对象并为每个数据库创建一个独立的引擎。以下是一个示例代码,展示了如何使用SQLAlchemy连接池连接多个MySQL数据库: ```python from sqlalchemy import create_engine from sqlalchemy.pool import QueuePool # 创建连接池1 pool1 = QueuePool( creator=lambda: mysql.connector.connect( host='localhost', database='database1', user='username1', password='password1' ), pool_size=5 ) # 创建连接池2 pool2 = QueuePool( creator=lambda: mysql.connector.connect( host='localhost', database='database2', user='username2', password='password2' ), pool_size=5 ) # 创建SQLAlchemy引擎1 engine1 = create_engine('mysql+mysqlconnector://', creator=pool1.get) # 创建SQLAlchemy引擎2 engine2 = create_engine('mysql+mysqlconnector://', creator=pool2.get) # 将DataFrame写入数据库1的表 df.to_sql(name='table1', con=engine1, if_exists='replace', index=False) # 将DataFrame写入数据库2的表 df.to_sql(name='table2', con=engine2, if_exists='replace', index=False) ``` 在上面的代码中,你需要将`database1`、`username1`、`password1`替换为第一个数据库的实际信息,将`database2`、`username2`、`password2`替换为第二个数据库的实际信息。 通过创建多个连接池对象和引擎对象,你可以连接多个MySQL数据库,并使用连接池管理数据库连接。 希望这可以满足你的需求!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值