首页 > 数据库 >Fastapi 项目第二天首次访问时数据库连接报错问题Can't connect to MySQL server

Fastapi 项目第二天首次访问时数据库连接报错问题Can't connect to MySQL server

时间:2024-06-30 18:09:11浏览次数:1  
标签:Fastapi 数据库 server 报错 连接池 recycle 连接 pool

问题描述

Fastapi 项目使用 sqlalchemy 连接的mysql 数据库,每次第二天首次访问数据库相关操作,都会报错:sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'x.x.x.x' ([Errno 111] Connection refused)")

问题分析

从出现问题的规律看,每次都是长时间不操作数据库,再操作时就会报错,但是第二次操作又正常访问了,说明跟数据库的连接超时有关。
数据库中通过以下命令查看超时时间

show VARIABLES like 'wait_timeout%'

wait_timeout 默认是28800秒,即mysql链接在无操作8个小时后被自动关闭,如果服务器长时间处于空闲状态,再次访问mysql数据库的时候,数据库会拒绝访问。

SQLALCHEMY 配置数据库时

engine = create_engine(SQLALCHEMY_DATABASE_URL)

create_engine 有个pool_recycle 参数
此设置会使池在经过给定的秒数后回收连接。它默认为-1,或者没有超时。例如,设置为3600意味着连接将在一小时后回收。请注意,如果在八个小时的连接中没有检测到任何活动,
MySQL尤其会自动断开连接(尽管这可以通过MySQLDB连接本身和服务器配置进行配置)

    :param pool_recycle=-1: this setting causes the pool to recycle
        connections after the given number of seconds has passed. It
        defaults to -1, or no timeout. For example, setting to 3600
        means connections will be recycled after one hour. Note that
        MySQL in particular will disconnect automatically if no
        activity is detected on a connection for eight hours (although
        this is configurable with the MySQLDB connection itself and the
        server configuration as well).

        .. seealso::

            :ref:`pool_setting_recycle`

解决问题

使用python的sqlalchemy连接数据库,不指定连接池的配置pool_recycle时,默认配置的连接回收pool_recycle=-1,就是永远不会回收。
mysql配置当中默认连接超过8小时,当超过8个小时没有新的数据库请求的时候,数据库连接就会断开,
如果我们连接池的配置是用不关闭或者关闭时间超过8小时,这个时候连接池没有回收并且还认为连接池与数据库之间的连接还存在,就会继续连接,但是数据库连接断开了,就会报错数据库连接失败!

解决办法:

  1. 修改mysql配置文件里wait_timeout参数,让这个时间大于连接池的回收时间(修改配置文件需要重启数据库,不推荐!)
  2. sqlalchemy将连接池连接回收时间设置小于8小时:
engine = create_engine(SQLALCHEMY_DATABASE_URL, pool_recycle=3600)  # 设置1小时

标签:Fastapi,数据库,server,报错,连接池,recycle,连接,pool
From: https://www.cnblogs.com/yoyoketang/p/18276734

相关文章

  • flutter项目报错[!] The ‘Pods-Runner‘ target has transitive dependencies that i
    运行flutter项目报错[!]The'Pods-Runner'targethastransitivedependenciesthatincludestaticallylinkedbinaries:(AMap2DMap/MAMapKit.framework,AMapLocation/AMapLocationKit.framework,andPods/AMapSearch/AMapSearchKit.framework)解决方案:使用静态框架......
  • 51 stm32开发关于keil mdk的软件配置常用设置 以及 可能会出现的报错总结
    首先左上角那个魔术棒中,是关于下载烧录软件编译的option选择我们点开他进入target需要我们配置的就两处,1:Xtal:填8.0mhz只是因为要填个数代表stm32(外部高速晶振)或(其他晶振)作为主频时钟的时钟源时的晶振大小方便烧录时对一些代码(对芯片的时钟要求高的代码)的自动编译,实际上......
  • SQLServer游标
    一.游标的作用:定位到结果集中的某一行(结果集:在完成了数据库的操作之后出现的所有的结果的集合)二.游标分为三类1.静态游标(static):操作游标时即使数据发生变化,游标中的数据也不会发生变化2.动态游标(dynamic):操作游标时若数据发生变化,则游标中数据同样改变3.键集驱动游标(keyse......
  • 遇到的编译报错提示
    编译报错wayland-clientsudoaptinstalllibwayland-devwayland-protocols>=1.24下载DEB包直接安装glslangValidatorrequiredbyvulkantestsnotfoundsudoaptinstallglslang-toolsNinja首先安装:sudoaptinstallninja-buildcmake.-GNinjacmake--......
  • 同样的软件版本、安装方法,但互联网环境就没有报错,是不是哪个地方设置不对?
    大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【斌】问了一个Python第三方库离线下载后使用失败的问题,问题如下:再次请教大佬,还是上述问题,同样的软件版本、安装方法,但互联网环境就没有报错,是不是哪个地方设置不对?@隔壁......
  • OCP4.2.2 主机标准化检查系统配置项修复clocksource 报错
    适应版本:社区版本OCP:4.2.2-20240315150922背景描述OCP纳管主机后进行主机标准化时,setclocksource一直没有成功   自动修复后还是有问题 分析过程查看官方ocp.4.2文档,有相关信息 执行相关命令再次查看文件并未写入tsc 重新检查 自动修复,......
  • python连接mysql、sqlserver、oracle、postgresql数据库进行封装
    python连接mysql、sqlserver、oracle、postgresql数据库进行封装python连接mysql、sqlserver、oracle、postgresql数据库进行封装详解一、引言二、python连接MySQL数据库进行封装三、python连接SQLServer数据库进行封装四、Python连接Oracle数据库进行封装五、Python连......
  • java使用@Controller注解跳转到thmyleaf页面时候报错
     报错如下######当我使用RestController时候接口可以得到返回的对象↓但是查看RestController和Controller的区别之后:也就是说@RestController返回的是一个对象,@Controller默认情况下,方法的返回值会被解析为一个视图名称,并寻找与该名称匹配的视图进行渲染。这意味着返回......
  • 服务器sql server 数据恢复
    linux服务器故障,连接了一台存储,文件系统为xfs文件系统。使用xfs_repair试图对文件系统进行修复但修复失败,linux服务器中所有数据因此丢失。服务器数据恢复解决方案:为了不损毁丢失数据盘里的数据,数据恢复的第一步必须对原始存储空间开进行镜像备份工作,数据备份完成后开始逐步确......
  • 十大java应用服务器(web server)总结
    java应用服务器(webserver),是指运行java程序的web应用服务器软件,不包括nginx、Apache等通用web服务器软件。一、TomcatTomcat是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。随着SpringBoot把tomcat作为默认的内嵌web服......