sqlalchemy QueuePool limit of size 3 overflow 20 reached, connection timed out, timeout
Posted on 2020-09-20 15:01 翔云123456 阅读(1199) 评论(0) 编辑 收藏 举报开发过程中,最郁闷的不是代码一直报错,而是明确知道代码执行有异常,但就是没有具体的错误报出来,无法进一步定位到问题的根因。
因此,平时工作中,养成良好的编码习惯是多么重要。
例如,在代码有异常的地方,打印下日志。这个看似细小的动作,会给以后排查问题带来莫大的帮助。
并且即使使用监控组件上报错误,也记得在本地打印下日志,方便问题追查。更何况,第三方监控组件可靠性不是百分之百的。万一,监控组件有个bug,把代码中的错误吞掉了。那更是增加问题排查的难度。
最近就遇到了类似的问题。
我们在代码中捕获异常后,先是使用cat 上报错误,接着将异常继续抛出。
但实际上是,cat上报错误时,将异常吞掉了,没有继续抛出异常。导致排查问题持续了很长时间。直到我们在调用cat上报错误之前,先打印下错误日志,才最终定位到了问题。
这种惨痛的教训不可谓不深刻。这已经是在cat上踩的第二个坑了。第一次是内存泄露。。。
言归正传,继续分享本文的重点:在使用sqlalchemy中遇到的报错:
QueuePool limit of size 5 overflow 20 reached, connection timed out, timeout 30
从错误,可以直观的看出,是获取连接时,由于连接的资源限制,被阻塞住了,直到30s超时。
代码中,连接配置如下:
creator = partial(creator, config=config, connect_params=connect_params)
engine = create_engine(
'mysql://',
pool_size=config.POOL_SIZE,
max_overflow=config.POOL_MAX_OVERFLOW,
creator=creator,
pool_pre_ping=pool_pre_ping,
strategy="contextlocal")
POOL_SIZE
是5,POOL_MAX_OVERFLOW
是20。
pool_size
表示连接池中缓存的连接数,如果为0,表示缓冲池大小无限制。
max_overflow
表示超出pool_size
的,允许建立的最大连接数量。如果为-1,表示无限制。
总的最大连接数 = pool_size
+ max_overflow
如果是在多线程中使用,并发线程数量大于 总的最大连接数,这个错误很容易报出来。
解决方法的话,有两种:
- 适当调大参数
- 优化应用程序代码,避免过多占用连接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现