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
1
CallMeReznov 2019-09-29 14:57:58 +08:00
session 关闭了吗
|
2
Vegetable 2019-09-29 15:02:43 +08:00
你数据库连接用完了没有正确放回连接池的样子,也许需要显示关闭吧,并没用过.
|
3
kayseen OP |
4
tisswb 2019-09-29 15:28:36 +08:00
如果使用 flask-sqlalchemy 扩展那么应该会自动关闭,如果没用这个扩展,那建议看看 flask-sqlalchemy 扩展如何实现的自动关闭 session
|
6
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 |
7
kppwp 2019-09-29 17:39:40 +08:00
我的建议是直接用 sqlalchemy
flask 那个拓展封装太多了 当初看 sqlalchemy 的文档看了好久啊 = = 老长了 官方给出的建议是每次都 session=Session() 然后用 try-except-finally 回滚关闭 |
8
neoblackcap 2019-09-29 17:44:38 +08:00
flask-sqlalchemy 将 sqlalchemy Session 跟 request 对象绑定在一起。
理论上啊,你这个错误有几种可能 1. request 对象泄露,不能正确被释放,导致 session 被占用(可能性较低) 2. 并发用户多,或者每个请求的处理时间比较长,导致连接池中的连接被消耗完 |
9
sazima 2019-09-29 22:10:17 +08:00
|
10
lolizeppelin 2019-09-30 18:47:05 +08:00 via Android
英文不是说很清楚了 池子最大 10 超过 10 了
|
11
coreki 2021-04-03 11:40:18 +08:00
老哥,最后怎么解决的,我也是 sqlalchemy,一个普通的 select 查询也会在 INNODB_TRX 显示有未完成的事务
|