2013-01-08 40 views
0

我查詢外部數據庫連接時,它拋出一個錯誤:錯誤消息關閉PostgreSQL中

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

服務器= 10.2.21.46;端口= 5432;用戶ID =用戶;密碼= abc123;數據庫=演示; –

+0

你有沒有在數據庫中定義的任何觸發器?我在尋找什麼是執行偵聽或NOTIFY – mvp

回答

0

據PostgreSQL的源代碼here,只有當服務器試圖執行從糟糕的狀態恢復會發生這個錯誤或長期失敗的交易(換句話說,目前感覺不太好)。

令人困惑的是,在這種情況下,它使用錯誤代碼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) 
... 
+0

錯誤不再顯示,這將表明它現在回來了,我現在正在工作。所以你說關閉連接不是隻讀事務? –

+0

它們也可能使用(d)某種類型的熱備份設置。在熱備份服務器上,即使對於只讀事務,您也會看到完全相同的行爲 – mvp