在 Windows 中,停止 postgres 服务会导致节点崩溃并显示“错误:由于管理员命令而终止连接”
Posted
技术标签:
【中文标题】在 Windows 中,停止 postgres 服务会导致节点崩溃并显示“错误:由于管理员命令而终止连接”【英文标题】:In windows, stopping postgres service causes node to crash with "error : terminating connection due to administrator command" 【发布时间】:2019-01-20 02:38:46 【问题描述】:场景 1:postgres 服务未运行。节点启动。休息呼叫超时 => 没有问题
场景 2:postgres 服务未运行。节点启动。 postgres 服务启动。休息调用工作 => 没有问题
场景 3:postgres 服务未运行。节点启动。 postgres 服务启动。休息电话工作。 postgres 服务停止 => 节点崩溃。
发生这种情况时的堆栈跟踪如下:
错误:由于管理员命令而终止连接 在 Connection.parseE (...\express.js\node_modules\pg\lib\connection.js:553:11) 在 Connection.parseMessage (...\express.js\node_modules\pg\lib\connection.js:378:19) 在套接字。 (...\express.js\node_modules\pg\lib\connection.js:119:22) 在 emitOne (events.js:116:13) 在 Socket.emit (events.js:211:7) 在 addChunk (_stream_readable.js:263:12) 在 readableAddChunk (_stream_readable.js:250:11) 在 Socket.Readable.push (_stream_readable.js:208:10) 在 TCP.onread (net.js:594:20)
我正在使用具有以下配置的 Postgres 池:
const pool = new Pool(
user: 'postgres',
host: 'localhost',
database: 'sampleDB',
password: 'password',
port: 5432,
max: 1,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
)
我该如何处理这种情况,这样节点才不会崩溃,并且可以返回到 Scenario-1,然后再转到 Scenario-2?
【问题讨论】:
捕捉错误。相应的 SQLSTATE 是57014
、57P01
和 57P02
。
@LaurenzAlbe 谢谢。我有几个与此相关的问题。 1:你是怎么得到代码的? 2:这是生产环境中可接受的方法吗?
java.sql.SQLException
有一个 getSQLState()
方法。这是区分不同错误的最佳方法。解析消息文本是个坏主意。
【参考方案1】:
在浏览了 node-postgres(link) 的文档后,我想出了一种方法来捕获这个错误并避免节点崩溃。
pool.on('error', (err, client) =>
console.log('postgres connection error : ' + err)
)
添加上述代码将允许节点处理错误而不是崩溃。
【讨论】:
以上是关于在 Windows 中,停止 postgres 服务会导致节点崩溃并显示“错误:由于管理员命令而终止连接”的主要内容,如果未能解决你的问题,请参考以下文章