V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kayseen
V2EX  ›  Python

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

  •  
  •   kayseen · 2019-09-29 14:26:07 +08:00 · 5528 次点击
    这是一个创建于 1917 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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

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

    1. request 对象泄露,不能正确被释放,导致 session 被占用(可能性较低)
    2. 并发用户多,或者每个请求的处理时间比较长,导致连接池中的连接被消耗完
    sazima
        9
    sazima  
       2019-09-29 22:10:17 +08:00
    lolizeppelin
        10
    lolizeppelin  
       2019-09-30 18:47:05 +08:00 via Android
    英文不是说很清楚了 池子最大 10 超过 10 了
    coreki
        11
    coreki  
       2021-04-03 11:40:18 +08:00
    老哥,最后怎么解决的,我也是 sqlalchemy,一个普通的 select 查询也会在 INNODB_TRX 显示有未完成的事务
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1452 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:17 · PVG 01:17 · LAX 09:17 · JFK 12:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.