我正在查询外部数据库,它会抛出错误:
ERROR: 25006: cannot execute UNLISTEN during recovery
我的理解是postgreSQL在完成时会调用它,这表明这是由关闭连接引起的。
对我来说奇怪的是,似乎代码可以打开与数据库的连接,但在尝试关闭连接时会出错。此外,这似乎只是偶尔发生,所以这可能是由于数据库本身重新启动了吗?
postgreSQL如何打开连接,但不能关闭?
下面是执行的代码,麻烦的行是dbConn.Close()
Dim sConnectionString as String = "Server=10.2.21.46;Port=5432;User Id=myuser;Password=mypsw;Database=demos;"
Dim sErrorMessage As String = ""
Dim bConnectionOpen As Boolean = False
Dim dbConn As Npgsql.NpgsqlConnection = New Npgsql.NpgsqlConnection(sConnectionString)
Try
dbConn.Open()
bConnectionOpen = True
Catch
sErrorMessage = "open connection fail."
End Try
If bConnectionOpen Then
Dim cmdTxt As String = sQueryString
Dim cmdTmp As Npgsql.NpgsqlCommand = New Npgsql.NpgsqlCommand(cmdTxt, dbConn)
Dim bReaderOpen As Boolean = False
Dim rsTmp As Npgsql.NpgsqlDataReader
Try
rsTmp = cmdTmp.ExecuteReader()
bReaderOpen = True
Catch
sErrorMessage = "ExecuteReader fail."
End Try
If bReaderOpen Then rsTmp.Close()
rsTmp = Nothing
dbConn.Close()
End If
答案 0 :(得分:0)
根据PostgreSQL源代码here,只有当服务器尝试从错误状态或长时间失败的事务执行恢复时才会发生此错误(换句话说,目前感觉不是很好)。< / p>
令人困惑的是,在这种情况下使用错误代码25006 ERRCODE_READ_ONLY_SQL_TRANSACTION
。我认为真正发生的事情是服务器不想写任何东西到磁盘上以免干扰当前的恢复 - 这就是为什么它是只读事务。
我认为您应该联系该外部服务器的管理员并让他看一看。简单的服务器重启可能有所帮助。或者,它可能需要从备份中恢复...
修改强>
此服务器也可能是热备用服务器。在热备用时,即使对于只读连接,您也会看到完全相同的行为。来自source code的代码段:
/*
* ... there are a few commands that are allowed
* in "read-only" xacts but cannot be allowed in Hot Standby mode.
* Those commands should call this function.
*/
PreventCommandDuringRecovery(const char *cmdname)
...