首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PostgreSQL中关闭连接时出现错误消息

在PostgreSQL中关闭连接时出现错误消息
EN

Stack Overflow用户
提问于 2013-01-08 18:38:22
回答 1查看 1.4K关注 0票数 0

我正在查询一个外部数据库,它抛出了一个错误:

代码语言:javascript
复制
ERROR: 25006: cannot execute UNLISTEN during recovery

我的理解是,每当postgreSQL完成时都会调用它,这表明这是由关闭连接引起的。

对我来说奇怪的是,代码似乎可以打开到数据库的连接,但在尝试关闭连接时出错。此外,这种情况似乎只会偶尔发生,所以这可能是由于数据库本身重新启动造成的吗?

为什么postgreSQL可以打开一个连接,但不能关闭一个连接?

下面是执行的代码,最麻烦的一行是dbConn.Close()

代码语言:javascript
复制
        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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-08 18:59:42

根据PostgreSQL源代码here的说法,只有当服务器试图从糟糕的状态或长期失败的事务中执行恢复时(换句话说,它现在感觉不是很好),才会发生此错误。

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

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

编辑:

也有可能此服务器曾经是/现在是热备用服务器。在热备模式下,即使是只读连接,你也会看到完全相同的行为。来自source code的代码片段

代码语言:javascript
复制
/* 
 * ... 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)
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14213076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档