2013-01-08 1 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

데이터베이스에 트리거가 정의되어 있습니까? 내가 무엇을 찾고 있는지는 LISTEN 또는 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