连接池耗尽修复.md 1.8 KB

连接池耗尽问题修复

问题现象

  • 连接池很快被耗尽(10个连接全部占用)
  • 前端只有一个手机在操作,却产生了12个WebSocket连接
  • 出现"连接池已耗尽,等待超时"错误

根本原因

  1. 前端重复初始化:React StrictMode导致组件重复mount/unmount,每次都创建新WebSocket
  2. 连接未正确释放:cleanup函数重置了initStarted标志,导致重新初始化
  3. 后端异常处理不完善:在start()方法异常时没有释放已获取的连接

修复方案

前端修复 (frontend/src/components/MainPage.tsx)

  1. 添加cleanupInProgress标志防止重复清理
  2. 移除cleanup中的initStarted.current = false,避免重复初始化
  3. 增强cleanup逻辑,确保资源被正确释放并设置为null

后端修复 (backend/websocket_handler.py)

  1. start()方法:在异常时立即释放已获取的连接
  2. cleanup()方法:
    • 添加详细日志追踪
    • 增强异常处理,即使清理失败也要释放连接
    • 添加警告日志,当没有连接需要释放时

连接池增强 (backend/connection_pool.py)

  • 添加get_pool_status()方法,方便监控连接池状态

监控方法

查看连接池状态

curl http://192.168.2.105:8000/stats

返回示例:

{
  "connection_pool": {
    "pool_size": 10,
    "idle": 5,
    "active": 5
  }
}

关键日志

  • 开始清理会话 {session_id}... - 会话开始清理
  • 释放会话 {session_id} 的豆包连接到连接池 - 连接被释放
  • 会话 {session_id} 没有豆包连接需要释放 - 警告:会话没有连接

建议

  1. 生产环境关闭React StrictMode(在vite.config.ts中配置)
  2. 提醒用户不要打开多个标签页
  3. 监控连接池状态,及时发现异常