当前位置: 首页 > news >正文

sqlalchemy连接池的长连接一直占用,无法释放导致服务卡住

1. 背景

django使用连接池连接数据库代理,数据库代理连接了主备两台数据库,当主数据库意外挂掉,而代理没有感知到的时候,django连接池内的长连接就会处于占用状态而永远不会被关闭

2. django数据库连接池参数

1. 数据库使用的是pg,因此引擎使用的是dj_db_conn_pool.backends.postgresql+sqlalchemy
2. options中可添加connect_timeout参数,控制连接数据超时时间
3. pool_options参数,大小写都可以,最终都会被转换成小写pre_ping, 默认True,表示在获取数据库连接池中的连接时,先去执行select 1,验证连接是否可用timeout, 默认30s,表示从连接池中获取空闲连接时超时时间,超过这个时间,就会返回失败。
(配置了,但是感觉没有用。应该是在连接池没满的时候,配置这个参数不会超时,会一直等待连接池去获取一个新的连接。但是如果连接池满了,就会等待这个时间,超时获取不到空闲连接,就会报错)recycle, 默认60
*15 15分钟,连接被回收的时间,只有空闲的连接才会被回收pool_size 默认10,连接池中的最大连接数量max_overflow 默认10,当连接池满了之后,可以获取额外10个连接。如果额外10个之后,还有请求就要等待timeout秒,
如果在这个时间有空闲的连接就会分配给新的请求,如果超时了还没有空闲连接,就会抛出异常。额外连接在一定时间(不会维护,用完就丢)之后会被关闭,不会进入连接池,
也就是连接池始终会保持最多pool_size的数量,max_overflow用完就丢

3. 连接池工作流程(猜测,未证实,比较菜,没有找到代码逻辑在哪个位置)

连接池里面会维护多个数据库的连接,就是你在settings的DATABASES中配置的各个数据库,我们一般只配一个数据库的话,就默认叫做default。此处我们只讨论配置一个数据库的情况。当代码中直行道有需要执行数据库操作的时候,会调用某个dj_db_conn_pool/core/mixins/core中的一个mixin类的get_new_connection,这个放回会调用队列池(QueuePool,默认的配置)的connect方法,connect会调用检出函数checkout,然后调用_do_get方法,判断是否超过连接池最大数量,然后去连接池中获取一个空闲的连接。
1.1 如果没有空闲连接会抛出异常,然后去重新申请一个新的连接
1.2. 如果有空闲连接,会从连接池队列中去获取一个(默认后进先出)连接
2. 如果是新建立的连接不会去pre_ping(因为是新获取的,所以没有必要),如果不是新获取的并且配置pre_ping为True,就会去执行select 1,测试连接是否可用

 

http://www.wxhsa.cn/company.asp?id=1042

相关文章:

  • 锁相关记录
  • 加入任务计划
  • 使用yolo算法对视频进行实时目标跟踪和分割
  • qoj2607 Survey
  • ubuntu24修改网络ip
  • ShardingSphere入门篇
  • 一个完整的项目管理流程都包括哪些环节?
  • 第5讲 机器学习生态构成 - 详解
  • Scaling Law之后AI的下一站:数据质量、效率与闭环的“军备竞赛”
  • 当前流行的前端框架
  • 移远EC800M RTOS笔记
  • Linux 实例:配置 NTP 服务
  • 选择MyEMS:为什么开源是能源数字化未来的最佳路径?
  • 0909模拟赛总结
  • 2025年前端开发,流框架的对比及最佳实践建议
  • 开发过程中常见的设计模式
  • 【OpenCV】9 图像基本变换
  • Java第二周课前思考
  • 2025 Vue UI 组件库选型
  • FHQ-Treap
  • 什么是ARM架构?你需要知道的一切
  • 程序连接金仓数据库查询报错:ERROR:column r.id does not exist。字段不存在
  • 论Intel CPU 进化史:德承工控机全面进化 搭载新一代 Intel Core™ Ultra 7/5/3 处理器 - Johnny
  • STM32F103C8T6标准库移植FreeRTOS教程
  • mysql绿色版,无需安装的快速数据库解决方案
  • MyEMS:功能强大的开源能源管理系统,助力企业实现精细化能效管理
  • mysql唯一索引,原理、创建与应用详解
  • redis查询和添加key的最简单方法
  • 111111
  • The 2025 ICPC Asia East Continent Online Contest (I) 7/13 A/B/C/D/G/I/M