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 示例场景:
# - 大型聚合查询执行时间过长
# - 网络拥塞导致响应延迟
# - 数据库服务器负载过高响应缓慢
# - 执行复杂的索引操作