Skip to content

PostgreSQL KnowDB 空闲后复用失效连接导致 connection closed #8

Description

@seeker-zuo

PostgreSQL KnowDB 空闲后复用失效连接导致 connection closed

问题现象

OML 使用 PostgreSQL KnowDB provider 做数据库富化时,进程启动后首次查询通常成功;空闲一段时间后,相同数据再次触发富化会出现:

postgres query_named_fields failed: connection closed

同一批事件中的多条 SQL 可能连续失败,但整体流程仍打印 oml proc suc,导致事件继续下发,数据库富化字段为空或缺失。

根因判断

当前依赖的 wp-knowledge 0.11.4 PostgreSQL provider 启动时一次性创建多个 tokio_postgres::Client,之后通过 round-robin 长期复用。

当 PostgreSQL 服务端、LB、NAT 或防火墙在空闲后关闭连接时,provider 仍会继续复用已经失效的 client。当前实现没有:

  • 查询前检查 Client::is_closed()
  • 连接失效后的剔除与重建
  • connection closed 后的重试逻辑
  • 后台 connection task 退出后的状态感知

因此会在空闲后稳定出现 connection closed。

期望修复

建议 PostgreSQL provider 增加失效连接恢复能力:

  • 查询前检测 client 是否已关闭
  • 查询遇到 connection closed 时重建连接
  • 对当前 SQL 至少重试一次
  • 或改用成熟连接池替代当前 Vec<Arc> 手工池实现

临时规避

  • 调整 cache.ttl_ms 无法解决,该参数只是查询结果缓存 TTL
  • 可通过外部定时轻量查询降低复现概率
  • 重启进程可临时恢复,但空闲后仍可能再次出现

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions