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 のソース コードはこちらによると、このエラーは、サーバーが悪い状態または長い間失敗したトランザクションからの回復を実行しようとしている場合 (つまり、現時点ではあまり気分が良くない場合) にのみ発生する可能性があります。

紛らわしいことに、この場合はエラー コード 25006 を使用していますERRCODE_READ_ONLY_SQL_TRANSACTION。サーバーが実際に起こっていることは、現在の回復を妨げないようにディスクに何も書きたくないことだと思います-それが読み取り専用トランザクションである理由です。

その外部サーバーの管理者に連絡して、見てもらうべきだと思います。単純なサーバーの再起動が役立つ可能性があります。または、バックアップから復元する必要があるかもしれません...

編集:

また、このサーバーがホット スタンバイ サーバーであった、またはホット スタンバイ サーバーである可能性もあります。ホットスタンバイでは、読み取り専用接続でもまったく同じ動作が見られます。ソースコードからのスニペット:

/* 
 * ... 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 に答える