You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo.sh v13角色数据库连接数超限致用户频繁断开问题求助

解决方案:Odoo.sh v13 PostgreSQL连接数超限问题

问题确认

先在Odoo.sh的shell环境中执行命令,确认当前连接数和角色上限:

# 查看当前该角色的数据库连接数
psql -c "SELECT count(*) FROM pg_stat_activity WHERE usename = 'p_my_oerp_master_1123445';"

# 查看该角色的连接数上限
psql -c "SELECT rolname, rolconnlimit FROM pg_roles WHERE rolname = 'p_my_oerp_master_1123445';"

如果当前连接数接近或达到上限,即可确认是连接耗尽导致的用户强制断开问题。

排查挂起进程

1. 定位异常数据库连接

执行命令查看所有非空闲连接的状态、启动时间和执行内容,锁定挂起进程:

psql -c "SELECT pid, state, query_start, query FROM pg_stat_activity WHERE usename = 'p_my_oerp_master_1123445' AND state != 'idle';"

重点关注state为active但query_start时间较早的记录,这类就是长期占用连接的挂起任务。

2. 关联Odoo进程

结合提供的ps -ax输出,找到对应PostgreSQL进程PID的Odoo父进程,确认是哪个工作进程在占用连接:

ps -ef | grep <postgres_pid>

# 直接查看所有Odoo进程状态,标记运行时间过长、内存占用高的进程
ps -ax | grep odoo

临时恢复措施

1. 终止挂起的数据库连接

对确认的挂起连接,直接执行终止命令:

# 单个终止
psql -c "SELECT pg_terminate_backend(<pid>);"

# 批量终止运行超过10分钟的非空闲连接
psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename = 'p_my_oerp_master_1123445' AND state != 'idle' AND query_start < now() - interval '10 minutes';"

2. 重启Odoo服务

在Odoo.sh控制台执行命令,清理所有挂起的Odoo进程:

odoo-restart

永久修复方案

1. 优化Odoo连接池配置

修改Odoo配置文件odoo.conf,调整连接池参数(需低于PostgreSQL角色的连接上限):

db_maxconn = 64
db_pool_overflow = 16
db_pool_timeout = 60

修改后重启Odoo服务生效。

2. 排查并修复业务逻辑问题

结合回溯日志和火焰图,定位导致进程挂起的根源:

  • 检查自定义模块中未加索引的报表、批量数据处理等慢查询
  • 确认定时任务(cron job)是否存在执行超时情况
  • 排查第三方集成同步任务是否未正确释放数据库连接

3. 申请提高PostgreSQL连接上限

由于Odoo.sh是托管环境,若现有连接上限无法满足业务需求,需提交官方支持工单,申请提高p_my_oerp_master_1123445角色的rolconnlimit值。

预防措施

  • 定期监控PostgreSQL连接状态,设置连接数达到上限80%时的告警
  • 为自定义模块的数据库操作添加超时控制
  • 优化定时任务逻辑,避免长时间占用数据库连接

内容的提问来源于stack exchange,提问作者Ahrimann Steiner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:46:06