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
相关产品推荐
相关产品推荐

