在 flask 中使用 sqlalchemy 遇到 mysql 的连接池错误,详情如下图,有遇到的吗

2019-09-29 14:26:07 +08:00
 kayseen
sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30 (Background on this error at: http://sqlalche.me/e/3o7r)

我试了一下, 每一次访问某个 api, 这个 api 就使用 query.filter(xxx).first() 来查询数据库,并没有事物操作, 然后我在 mysql 中使用SELECT * FROM information_schema.INNODB_TRX;来查看当前有哪些事物, 然后每使用一次 api, SELECT * FROM information_schema.INNODB_TRX;就会多一条记录, 当这些记录达到 20 条时, 就会报如上的错误,api 也就无法访问了, 然后过了一段时间之后,这些记录会自动清除,

在网上实在是没有找到解决办法, 如果有遇到过这问题的不胜感激, 我在项目中的 sqlalchemy 配置如下几个选项:

SQLALCHEMY_DATABASE_URI SQLALCHEMY_TRACK_MODIFICATIONS SQLALCHEMY_ECHO

5390 次点击
所在节点    Python
11 条回复
CallMeReznov
2019-09-29 14:57:58 +08:00
session 关闭了吗
Vegetable
2019-09-29 15:02:43 +08:00
你数据库连接用完了没有正确放回连接池的样子,也许需要显示关闭吧,并没用过.
kayseen
2019-09-29 15:04:29 +08:00
@CallMeReznov
@Vegetable
这期间我只使用了`xx.query.filter().first()`操作,
没有进行其他的操作, 使用 query 的时候也需要手动关闭连接吗?
tisswb
2019-09-29 15:28:36 +08:00
如果使用 flask-sqlalchemy 扩展那么应该会自动关闭,如果没用这个扩展,那建议看看 flask-sqlalchemy 扩展如何实现的自动关闭 session
kayseen
2019-09-29 16:24:43 +08:00
@tisswb 我现在用的是这个扩展...
Latin
2019-09-29 17:02:17 +08:00
# Flask-SQLAlchemy Setting
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_RECORD_QUERIES = True
SQLALCHEMY_POOL_SIZE = 1024
SQLALCHEMY_POOL_TIMEOUT = 90
SQLALCHEMY_POOL_RECYCLE = 3
SQLALCHEMY_MAX_OVERFLOW = 1024
kppwp
2019-09-29 17:39:40 +08:00
我的建议是直接用 sqlalchemy
flask 那个拓展封装太多了
当初看 sqlalchemy 的文档看了好久啊 = = 老长了
官方给出的建议是每次都 session=Session() 然后用 try-except-finally 回滚关闭
neoblackcap
2019-09-29 17:44:38 +08:00
flask-sqlalchemy 将 sqlalchemy Session 跟 request 对象绑定在一起。
理论上啊,你这个错误有几种可能

1. request 对象泄露,不能正确被释放,导致 session 被占用(可能性较低)
2. 并发用户多,或者每个请求的处理时间比较长,导致连接池中的连接被消耗完
sazima
2019-09-29 22:10:17 +08:00
lolizeppelin
2019-09-30 18:47:05 +08:00
英文不是说很清楚了 池子最大 10 超过 10 了
coreki
2021-04-03 11:40:18 +08:00
老哥,最后怎么解决的,我也是 sqlalchemy,一个普通的 select 查询也会在 INNODB_TRX 显示有未完成的事务

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/605369

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX