0

我正在查询一个外部数据库,它会引发以下错误:

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
4

1 回答 1

0

根据此处的 PostgreSQL 源代码,只有当服务器试图从错误状态或长时间失败的事务中执行恢复时才会发生此错误(换句话说,目前感觉不太好)。

ERRCODE_READ_ONLY_SQL_TRANSACTION令人困惑的是,在这种情况下,它使用的是错误代码 25006 。我认为真正发生的事情是服务器不想将任何内容写入磁盘以不干扰当前的恢复 - 这就是它是只读事务的原因。

我认为您应该联系该外部服务器的管理员并请他看一下。简单的服务器重启可能会有所帮助。或者,它可能需要从备份中恢复...

编辑:

该服务器也可能是/是热备用服务器。在热备状态下,即使是只读连接,您也会看到完全相同的行为。源代码片段:

/* 
 * ... 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)
...
于 2013-01-08T10:59:42.353 回答