美文网首页
sqlalchemy 连接池QueuePool踩坑

sqlalchemy 连接池QueuePool踩坑

作者: 越大大雨天 | 来源:发表于2020-05-12 15:31 被阅读0次

    这里不啰嗦直接记录一下结论吧。

    在使用sqlalchemy连接池的时候,配置好engine后部署项目,初始都是正常的。但经过一段时间后,再次调用接口将会发现连接池中的连接失效了,这很可能是你在连接池中设置的回收时间大于SQL数据库配置的未活动失效时间导致的。

    查看数据库未活动超时时间

    在MySQL中执行指令查看:
    show variables like "interactive_timeout";

    +---------------------+-------+
    | Variable_name       | Value |
    +---------------------+-------+
    | interactive_timeout | 1800 |
    +---------------------+-------+
    

    一般来说数据库默认的超时时间是8小时,我这次就是遇到的数据库比较奇葩,30分钟闲置连接就会超时失效。所以一定要先确认数据库的这个超时参数实际是多少。

    engine配置

    配置SQLAlchemy的engine是很重要的,有些参数一定要知道,我这里的配置方式大致如下:

    engine = create_engine(
            "mysql+pymysql://user:password@127.0.0.1:3306/test?charset=utf8",
            pool_size=10,
            pool_recycle=1600,
            pool_pre_ping=True,
            pool_use_lifo=True,
            echo_pool=True,
            max_overflow=5
    )
    
    • pool_size: 连接池大小;
    • pool_recycle:连接回收时间,这个值必须要比数据库自身配置的interactive_timeout值小
    • pool_pre_ping:预检测池中连接是否有效,并替换无效连接;
    • pool_use_lifo:使用后进先出的方式获取连接,允许多余连接保持空闲;
    • echo_pool:会打印输出连接池的异常信息,帮助排查问题;
    • max_overflow: 最大允许溢出连接池大小的连接数量。

    总结

    注意按需配置engine参数,sqlalchemy并不能随时知道连接池中的连接是否仍然有限,在应用程序中使用完一个连接后,记得调用close()方法将连接放回连接池。
    一定注意设置连接回收时间小于数据库配置的失效时间,还有很多有用的参数可以去https://www.osgeo.cn/sqlalchemy/core/pooling.html
    这里看看,也对你有帮助。

    相关文章

      网友评论

          本文标题:sqlalchemy 连接池QueuePool踩坑

          本文链接:https://www.haomeiwen.com/subject/xyvbnhtx.html