You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI连接MongoDB遇DNS超时问题:代码修改重启后报错

FastAPI连接MongoDB重启时DNS超时问题解决

问题描述

使用FastAPI连接MongoDB时,偶尔能成功建立连接,但修改代码重启服务器时,会触发以下错误:

pymongo.errors.ConfigurationError: The DNS operation timed out after 21.168028831481934 seconds

使用的版本信息:

python: 3.8.2
fastapi==0.62.0
motor==2.3.0
databases==0.5.5
odmantic==0.4.0
pydantic==1.8.2

当前数据库连接代码:

from motor.motor_asyncio import AsyncIOMotorClient
from ..core.config import MONGODB_URL, MAX_CONNECTIONS_COUNT, MIN_CONNECTIONS_COUNT
import asyncio
from odmantic import AIOEngine


class DataBase:
    client: AsyncIOMotorClient = None

db = DataBase()
db.client = AsyncIOMotorClient(str(MONGODB_URL))
db.client.get_io_loop = asyncio.get_event_loop
engine = AIOEngine(motor_client=db.client)

解决方案

1. 改用异步初始化客户端

当前代码在模块加载阶段同步创建MongoDB客户端,重启时可能因事件循环未就绪、DNS解析时机不当导致超时。改为在FastAPI启动事件中异步初始化:

from motor.motor_asyncio import AsyncIOMotorClient
from ..core.config import MONGODB_URL, MAX_CONNECTIONS_COUNT, MIN_CONNECTIONS_COUNT
from odmantic import AIOEngine
from fastapi import FastAPI

class DataBase:
    client: AsyncIOMotorClient = None
    engine: AIOEngine = None

db = DataBase()

async def connect_to_mongo(app: FastAPI):
    db.client = AsyncIOMotorClient(
        str(MONGODB_URL),
        maxPoolSize=MAX_CONNECTIONS_COUNT,
        minPoolSize=MIN_CONNECTIONS_COUNT
    )
    db.engine = AIOEngine(motor_client=db.client)
    # 可选:提前测试连接有效性
    await db.client.admin.command("ping")

async def close_mongo_connection(app: FastAPI):
    db.client.close()

# 在FastAPI实例中注册事件(需替换为你的app对象)
# app.add_event_handler("startup", connect_to_mongo)
# app.add_event_handler("shutdown", close_mongo_connection)

2. 配置客户端超时与重试参数

显式设置DNS解析和连接的超时时间,开启读写重试,降低超时概率:

db.client = AsyncIOMotorClient(
    str(MONGODB_URL),
    serverSelectionTimeoutMS=5000,  # 缩短服务器选择超时至5秒
    connectTimeoutMS=3000,          # 连接超时3秒
    retryWrites=True,
    retryReads=True
)

3. 排查网络与DNS缓存

  • 重启服务器前手动清除本地DNS缓存:Windows执行ipconfig /flushdns,Linux执行systemd-resolve --flush-caches
  • 尝试将MongoDB连接字符串中的主机名替换为IP地址,测试是否仍出现超时

4. 升级依赖版本

当前motor和odmantic版本较旧,可能存在异步连接的已知问题,升级至新版本:

pip install --upgrade motor odmantic

内容的提问来源于stack exchange,提问作者aman kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:45:15