pymongo默认连接池最大大小为100、最小空闲连接数为0;该连接池绑定于每个mongoclient实例,非全局共享,需通过maxpoolsize和minpoolsize参数显式配置,且必须在实例化时传入。

PyMongo 默认连接池大小是多少?
PyMongo 的 ThreadPool 连接池默认最大连接数是 100,最小空闲连接数是 0。这个值不是硬编码在代码里,而是由 maxPoolSize 和 minPoolSize 参数控制的,不显式设置时就走默认值。
注意:这个“池”是每个 MongoClient 实例独享的,不是全局共享的。多个 MongoClient 就意味着多个独立池 —— 很多人误以为复用同一个 URI 就能共用连接,其实不然。
-
maxPoolSize=100是上限,但实际活跃连接数取决于并发请求量和操作耗时 -
minPoolSize=0意味着低峰期连接可能全部释放,下次请求需重建,带来毫秒级延迟 - 如果应用长期稳定高并发,设
minPoolSize=20能减少连接震荡
如何显式配置连接池参数?
必须在创建 MongoClient 时通过关键字参数传入,不能运行时修改。URL 中也能传,但容易被忽略或写错格式。
推荐用关键字参数方式,清晰且类型安全:
from pymongo import MongoClient
client = MongoClient(
"mongodb://localhost:27017/",
maxPoolSize=50,
minPoolSize=10,
maxIdleTimeMS=60000,
timeoutMS=5000
)
-
maxPoolSize和minPoolSize必须是整数,且minPoolSize ≤ maxPoolSize,否则初始化直接抛ConfigurationError -
maxIdleTimeMS控制空闲连接存活时间(毫秒),设太小会导致频繁建连;设太大可能占用服务端资源 -
timeoutMS是 socket 级超时,和连接池大小无关,但常被一起调优
连接池大小设多大才合适?
没有通用公式,得看你的部署结构和负载特征。盲目设成 500 或 1000 反而可能触发 MongoDB 服务端的 maxConns 限制或引发内存压力。
- 单个 Web 应用进程(如 Flask/Gunicorn)建议按 worker 数 × 平均每 worker 并发请求数估算,通常 20–80 足够
- 使用 Gunicorn 时,若开了 4 个 worker,每个 worker 内复用一个
MongoClient,那总连接数 ≈ 4 ×maxPoolSize - 连接数超过 MongoDB 的
net.maxIncomingConnections(默认 65536)倒不是瓶颈,但每个连接占约 1MB 内存,服务端扛不住 - 用
db.command("serverStatus")["connections"]查实时连接数,比盲猜靠谱
常见踩坑点:连接泄漏与重复实例
最典型的不是设错数字,而是根本没意识到连接池绑定在 MongoClient 实例上。
- 每次 HTTP 请求都 new 一个
MongoClient→ 每次都新建池 → 连接数爆炸,OS 句柄耗尽 - 用 class 实例属性存 client,但 class 被反复构造 → 仍会泄漏
- 用
atexit.register()关闭 client?没用 —— 进程结束前池已自动清理,关键是别乱 new - 真正做法:模块级单例,或依赖注入容器统一管理生命周期
连接池本身不难配,难的是让整个应用只持有一个 MongoClient 实例,并理解它背后是线程安全、进程不共享、异步不兼容(PyMongo 不支持 asyncio 原生,要用 motor)这些隐含约束。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











