在 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 是 5701457P0157P02 @LaurenzAlbe 谢谢。我有几个与此相关的问题。 1:你是怎么得到代码的? 2:这是生产环境中可接受的方法吗? java.sql.SQLException 有一个 getSQLState() 方法。这是区分不同错误的最佳方法。解析消息文本是个坏主意。 【参考方案1】:

在浏览了 node-postgres(link) 的文档后,我想出了一种方法来捕获这个错误并避免节点崩溃。

pool.on('error', (err, client) => 
    console.log('postgres connection error : ' + err)
)

添加上述代码将允许节点处理错误而不是崩溃。

【讨论】:

以上是关于在 Windows 中,停止 postgres 服务会导致节点崩溃并显示“错误:由于管理员命令而终止连接”的主要内容,如果未能解决你的问题,请参考以下文章

windows激活客户端已停止工作怎么解决?

遇到错误时如何停止 Postgres 脚本?

更新的Xubuntu,Postgres停止工作

为啥我的 postgres 工作停止运行?

在windows中连接postgres的批处理文件

redis -003 作为windows服务 自动启动