最稳妥的 MongoDB 连接方式是 mongo.Connect + context.WithTimeout + options.Client().ApplyURI;URI 需正确指定 authSource 和默认数据库,必须设超时避免服务 hang 住,连接池应显式配置大小,Client 可全局复用。

mongo.Connect + context.WithTimeout + options.Client().ApplyURI 是当前(2026年)最稳妥的连接方式,别再用已弃用的 mgo 或裸写 net.Dial。
URI 格式写错会导致连接静默失败
常见错误是把用户名密码拼在 URI 里但漏掉 authSource 或默认数据库名,结果报 Authentication failed 却查不到原因。
- 本地无认证:用
mongodb://localhost:27017就够,不用加/admin后缀 - 带账号密码时,必须显式指定认证库,比如
mongodb://admin:123456@localhost:27017/admin?authSource=admin - Atlas 连接字符串自带
?authMechanism=SCRAM-SHA-256&tls=true,删掉就连不上 - URI 中的
/demo(斜杠后那段)是「默认数据库名」,不是认证库,别和authSource混用
不设 context 超时,服务启动可能卡死
mongo.Connect 默认会无限等待 DNS 解析或网络响应,线上部署时一旦 MongoDB 不可达,整个 Go 服务就 hang 住。
- 必须用
context.WithTimeout(context.Background(), 10*time.Second)包一层 -
defer cancel()要放在mongo.Connect调用前,否则超时后资源没释放 - 别用
context.TODO()或context.Background()直接传进去——这是新手高频坑 - 测试环境可放宽到 10 秒,生产建议 3~5 秒,配合重试逻辑更稳
连接池大小不调,高并发下容易打满
默认最大连接数是 100,但很多小项目其实 10~20 就够;设太大反而占内存、触发 MongoDB 的 maxIncomingConnections 限制。
- 用
o.SetMaxPoolSize(20)显式控制,别依赖默认值 - 如果应用是短连接密集型(比如 CLI 工具),可以设小点;长连接服务(如 HTTP API)建议 30~50
- 注意
SetMinPoolSize一般不用设,Go driver 会懒加载,设了反而提前占资源 - 连接池不够时典型现象:日志里反复出现
connection pool is full或请求延迟陡增
Ping 不校验读写能力,只确认基础连通性
client.Ping(ctx, nil) 只测 TCP 和认证通不通,不代表能写入或读取集合。真正要验证,得做一次最小写操作。
立即学习“go语言免费学习笔记(深入)”;
- 推荐用
client.Ping(ctx, readpref.Primary()),强制走主节点,比nil更严格 - 更彻底的检查:插入一条带
_id的文档再立刻查出来,比如InsertOne(..., bson.M{"_id": "health-check"}) - 别在
init()里做 Ping —— 如果 DB 暂不可用,整个程序 panic,应该让启动流程容忍短暂不可用 - 健康检查接口里做这个动作比启动时更合理
*mongo.Client)是线程安全的,可以全局复用,但很多人每次请求都新建一个,既浪费又触发频繁握手。初始化一次,存在包级变量或依赖注入容器里,才是常态。


















