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
NeverBelieveMe
V2EX  ›  Python

flask_sqlalchemy MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))

  •  
  •   NeverBelieveMe · 2019-01-02 17:15:26 +08:00 · 2907 次点击
    这是一个创建于 2188 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个问题有大佬碰到过么?不知道怎么解决,网上搜了 SQLALCHEMY_POOL_SIZE,SQLALCHEMY_POOL_RECYCLE 这两个参数设定的方案也不成功。现在不太清楚怎么解决。而且也不明白什么原因导致的问题。
    12 条回复    2019-01-03 12:03:12 +08:00
    myyou
        1
    myyou  
       2019-01-02 17:23:53 +08:00
    这个表示 mysql 连接已经断开了,SQLALCHEMY_POOL_RECYCLE 设置短一些,或者不使用连接池,去掉 SQLALCHEMY_POOL_SIZE 和 SQLALCHEMY_POOL_RECYCLE
    liuzhedash
        2
    liuzhedash  
       2019-01-02 17:24:20 +08:00
    这要看 mysql 的 error.log 来确定问题,你改 sqlalchemy 那俩参数似乎并无根据呀?
    NeverBelieveMe
        3
    NeverBelieveMe  
    OP
       2019-01-02 17:33:03 +08:00
    @myyou 我原来没有设置出了问题,然后才加的,加了也没用。
    NeverBelieveMe
        4
    NeverBelieveMe  
    OP
       2019-01-02 17:33:24 +08:00
    @liuzhedash 这样啊,那我去找找看 mysql 的日志。
    qq316107934
        5
    qq316107934  
       2019-01-02 17:35:22 +08:00 via Android
    session 泄露没有关闭吧,用 try catch 加上下文管理器试试?
    NeverBelieveMe
        6
    NeverBelieveMe  
    OP
       2019-01-02 17:52:57 +08:00
    @qq316107934 session 每个请求内用完都要关掉么?
    qq316107934
        7
    qq316107934  
       2019-01-02 17:57:02 +08:00
    @NeverBelieveMe #6 有些版本的 sqlalchemy session 池管理有问题,用完关掉不是很影响效率,而且能解决报错的问题。
    xayoung
        8
    xayoung  
       2019-01-02 17:58:59 +08:00
    我是每次用完 session 关掉,才完全解决这个问题的。
    est
        9
    est  
       2019-01-02 18:02:52 +08:00   ❤️ 2
    @qq316107934

    其实大家不用猜了。python 的几乎所有库的连接池都有问题

    原因很简单,连接池应该在一定超时时间 idle 之后去自动重连一个的。python 的 threading、协程的状况,几乎没有一个库去实现一个 timer 主动去轮换连接。都是一个 db 操作的动作再去检查连接。然后远端主动关闭,python 的 tcp 其实是没法响应 TIME_WAIT 的。于是一发过去就 Broken pipe。。
    Joe0920
        10
    Joe0920  
       2019-01-02 20:20:27 +08:00
    @est 那应该咋解决?就是有那种好久没人使用的系统,一来又一顿猛着用那种
    tanszhe
        11
    tanszhe  
       2019-01-02 20:25:41 +08:00 via Android
    几行代码
    就能搞定的事情
    fanhaipeng0403
        12
    fanhaipeng0403  
       2019-01-03 12:03:12 +08:00
    db.session.close()

    每次都关掉,绝对会解决
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2867 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:09 · PVG 21:09 · LAX 05:09 · JFK 08:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.