首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   kayseen · 69 天前 · 1365 次点击
    这是一个创建于 69 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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

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

    1. request 对象泄露,不能正确被释放,导致 session 被占用(可能性较低)
    2. 并发用户多,或者每个请求的处理时间比较长,导致连接池中的连接被消耗完
        10
    lolizeppelin   68 天前 via Android
    英文不是说很清楚了 池子最大 10 超过 10 了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2296 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 14:16 · PVG 22:16 · LAX 06:16 · JFK 09:16
    ♥ Do have faith in what you're doing.