PyMongo 中 `ServerSelectionTimeoutError` 和 `NetworkTimeout` 异常的区别
ServerSelectionTimeoutError vs NetworkTimeout 的区别
1. ServerSelectionTimeoutError
- 继承关系:
ServerSelectionTimeoutError -> AutoReconnect -> ConnectionFailure -> PyMongoError
- 触发时机: 当 PyMongo 无法找到合适的服务器来执行操作时抛出
- 超时配置: 由
serverSelectionTimeoutMS 参数控制(默认 30 秒)
- 具体场景:
- 无法连接到任何 MongoDB 服务器
- 副本集没有主节点且在超时时间内未选出主节点
- 尝试使用副本集无法满足的读取偏好进行查询
- 所有可用服务器都不符合查询条件
2. NetworkTimeout
- 继承关系:
NetworkTimeout -> AutoReconnect -> ConnectionFailure -> PyMongoError
- 触发时机: 当在已打开的连接上执行操作超过
socketTimeoutMS 时抛出
- 超时配置: 由
socketTimeoutMS 参数控制
- 具体场景:
- 已经建立连接,但单个操作(如查询、插入、更新)执行时间过长
- 网络延迟导致操作响应超时
- 数据库服务器处理请求时间过长
3. 关键区别
| 方面 | ServerSelectionTimeoutError | NetworkTimeout |
|---|
| 发生阶段 | 连接选择阶段 | 操作执行阶段 |
| 连接状态 | 尚未建立有效连接 | 连接已建立 |
| 配置参数 | serverSelectionTimeoutMS | socketTimeoutMS |
| 默认超时 | 30 秒 | 无默认值(需要显式设置) |
| 池连接影响 | 不影响连接池 | 池中其他连接保持开放 |
| 操作状态 | 操作未开始执行 | 操作可能已部分执行 |
4. 实际应用场景示例