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
相关产品推荐
相关产品推荐

