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. 实际应用场景示例
python
# ServerSelectionTimeoutError 示例场景:
# - MongoDB 服务器全部宕机
# - 网络分区导致无法访问任何服务器
# - 副本集配置错误
# - 读取偏好配置错误(如要求从不存在的辅助节点读取)
# NetworkTimeout 示例场景:
# - 大型聚合查询执行时间过长
# - 网络拥塞导致响应延迟
# - 数据库服务器负载过高响应缓慢
# - 执行复杂的索引操作