Files
hzdyjs/超星数据移植与定时同步/修复说明.md
T
2025-11-27 00:02:01 +08:00

2.9 KiB
Raw Permalink Blame History

请求学生信息API.py 修复说明

问题描述

脚本执行30多分钟后报错:

  • (1053, 'Server shutdown in progress') - MySQL服务器正在关闭
  • (2013, 'Lost connection to MySQL server during query') - 连接丢失

根本原因

长时间运行的脚本,MySQL连接超时或断开,导致数据库操作失败。原代码没有:

  1. 连接保活机制
  2. 自动重连机制
  3. 异常恢复能力

解决方案

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确保连接关闭

使用建议

  1. 运行前检查MySQL配置:

    • wait_timeout 和 interactive_timeout 建议设置为 28800(8小时)
    • max_allowed_packet 建议设置足够大(如16M)
  2. 监控日志:

    • 观察"创建新的数据库连接"消息
    • 检查"连接ping失败"警告
    • 注意重试次数和等待时间
  3. 调整参数(如需要):

    • _ping_interval: 默认60秒,可根据MySQL的wait_timeout调整
    • max_retries: 默认3次,可根据网络稳定性调整
    • batch_size: 默认100条,可根据数据大小调整

测试建议

  1. 运行脚本观察是否能正常完成
  2. 检查日志中的连接管理信息
  3. 验证数据完整性
  4. 如果仍有问题,可以:
    • 减小batch_size(如改为50)
    • 减小_ping_interval(如改为30秒)
    • 增加MySQL的wait_timeout值