DBeaver连接Fly.io上PostgreSQL时因错误陷入无限循环求助
核心问题
Fly.io托管的PostgreSQL实例,使用plpython3u扩展时出现异常:执行含语法错误、表名错误或函数返回错误的代码时,查询会无限循环,手动终止后抛出连接关闭的异常(如下),该问题仅生产环境存在,本地环境正常。
org.postgresql.util.PSQLException: This connection has been closed. at org.postgresql.jdbc.PgConnection.checkClosed(PgConnection.java:907) at org.postgresql.jdbc.PgConnection.createStatement(PgConnection.java:1776) at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCConnectionImpl.createStatement(JDBCConnectionImpl.java:413) at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCConnectionImpl.prepareStatement(JDBCConnectionImpl.java:131) at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCConnectionImpl.prepareStatement(JDBCConnectionImpl.java:1) at org.jkiss.dbeaver.model.DBUtils.createStatement(DBUtils.java:1453) at org.jkiss.dbeaver.model.DBUtils.makeStatement(DBUtils.java:1419) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:558) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$1(SQLQueryJob.java:491) at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:190) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:498) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:934) at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:3940) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:123) at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:190) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:121) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5142) at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:105) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
排查步骤
版本一致性检查:对比本地和生产环境的PostgreSQL版本、
plpython3u扩展版本,执行以下SQL查询:SELECT version(); SELECT extname, extversion FROM pg_extension WHERE extname = 'plpython3u';Fly.io可能自动推送了版本更新,导致扩展兼容性问题。
查看数据库日志:通过
fly logs命令拉取生产实例的日志,重点关注查询卡住时段的输出,排查是否存在plpython3u相关的崩溃日志、资源耗尽(CPU/内存)提示,或进程死锁信息。函数错误处理验证:检查生产环境中自定义的
plpython3u函数,确认是否遗漏了异常捕获逻辑(如Python的try-except块)。若函数在出错时未正确终止,可能进入无限循环。对比本地环境的函数定义,排查差异。资源限制排查:通过Fly.io控制台查看生产实例的实时资源使用情况,确认CPU、内存是否在查询出错时出现耗尽。资源不足可能导致进程无法正常终止,表现为无限循环。
纯SQL错误测试:执行不含
plpython3u的错误SQL(如SELECT * FROM non_existent_table;),验证是否同样出现无限循环。若纯SQL错误也触发问题,说明故障点在PostgreSQL本身或Fly.io环境配置;若仅涉及plpython3u的查询出错,则聚焦扩展或自定义函数。客户端配置对比:检查DBeaver在本地和生产环境的连接配置,重点对比查询超时、自动重试、连接保持等参数。客户端的重试机制可能导致出错时持续发起请求,误判为查询无限循环。
内容的提问来源于stack exchange,提问作者Guilherme Rodrigues

