2.9 KiB
2.9 KiB
请求学生信息API.py 修复说明
问题描述
脚本执行30多分钟后报错:
(1053, 'Server shutdown in progress')- MySQL服务器正在关闭(2013, 'Lost connection to MySQL server during query')- 连接丢失
根本原因
长时间运行的脚本,MySQL连接超时或断开,导致数据库操作失败。原代码没有:
- 连接保活机制
- 自动重连机制
- 异常恢复能力
解决方案
1. 添加数据库连接管理
在__init__方法中添加:
self._db_connection = None
self._last_ping_time = 0
self._ping_interval = 60 # 每60秒ping一次数据库
2. 实现连接池和保活机制
新增_get_db_connection()方法:
- 创建带超时配置的数据库连接
- 定期ping数据库保持连接活跃(每60秒)
- 自动检测并重连断开的连接
3. 实现重试机制
新增_execute_with_retry()方法:
- 捕获特定的连接错误(2013, 2006, 1053)
- 最多重试3次
- 递增等待时间(2秒、4秒、6秒)
4. 重构主要方法
get_and_save_students_batch()
- 使用
_execute_with_retry()包装数据库操作 - 在批量提交时自动ping连接
- 统一的异常处理和资源释放
sync_student_msg()
- 使用
_execute_with_retry()包装整个同步逻辑 - 确保连接断开时自动重试
_insert_into_target()
- 在每100条记录批量提交前ping连接
- 确保长时间运行时连接保持活跃
5. 改进错误处理
- 添加详细的错误堆栈信息(traceback)
- 失败时返回已保存的数量而不是0
- 更好的日志输出
主要改进点
| 改进项 | 说明 |
|---|---|
| 连接超时配置 | connect_timeout=30, read_timeout=60, write_timeout=60 |
| 连接保活 | 每60秒自动ping数据库 |
| 自动重连 | 连接断开时自动重建连接 |
| 重试机制 | 遇到连接错误最多重试3次 |
| 批量提交优化 | 每批提交前ping连接 |
| 错误日志 | 添加完整的traceback信息 |
| 资源管理 | 使用finally确保连接关闭 |
使用建议
-
运行前检查MySQL配置:
wait_timeout和interactive_timeout建议设置为 28800(8小时)max_allowed_packet建议设置足够大(如16M)
-
监控日志:
- 观察"创建新的数据库连接"消息
- 检查"连接ping失败"警告
- 注意重试次数和等待时间
-
调整参数(如需要):
_ping_interval: 默认60秒,可根据MySQL的wait_timeout调整max_retries: 默认3次,可根据网络稳定性调整batch_size: 默认100条,可根据数据大小调整
测试建议
- 运行脚本观察是否能正常完成
- 检查日志中的连接管理信息
- 验证数据完整性
- 如果仍有问题,可以:
- 减小
batch_size(如改为50) - 减小
_ping_interval(如改为30秒) - 增加MySQL的
wait_timeout值
- 减小