2009-03-26 3 views
3

db 서버에 연결할 수없는 앱의 가능한 원인을 추적하려고합니다.서비스가 부팅시 시작될 때 데이터베이스 연결이 작동하지 않지만 수동으로 시작될 때 작동합니다.

데이터베이스 서비스를 시작할 때 데이터베이스에 연결하는 Windows 서비스가 있습니다. 이 서비스는 신뢰할 수있는 유선 네트워크 연결이있는 시스템에서 실행됩니다. 자동으로 시작되도록 자동 설치되므로 일반적으로 Windows가 시작될 때 시작되며 거의 모든 경우에 정상적으로 작동합니다.

그러나 한 대의 XP 컴퓨터 (제어 할 수 없음)를 사용하면 서비스가 시작될 때 서비스가 시작될 때 데이터베이스 연결이 실패합니다. 표준 예외가 발생합니다 : 사용자가 로그인이 꽤 이상한 인, 올바르게 데이터베이스에 연결 수동으로 서비스를 시작하면이 기계에

System.Data.SqlClient.SqlException: An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)

. 그래서 윈도우 시작시 문제 중 하나입니다 같아요

네트워크가 연결되기 전에 서비스가 시작
  • 기계가 어떻게 DB 서버 이름 인 경우 (서버 이름을 해결하기 위해 DNS에 연결하기 전에 서비스 시작 ...
  • 가 처음 나가는 연결을 다른
  • 것을 방지 시스템에 정책/방화벽/등이있다)

을 해결 문제는 때 사용자 manuall 발생하지 않습니다 y가 서비스를 시작하므로 문제를 해결하기 위해 무언가가 발생 했어야합니다. 내 생각에 이것은 시작시 실행되지만 내 서비스가 시작될 때 완료되지 않은 프로세스이거나 사용자가 로그인 한 사실 (로그온 스크립트에있는 것) 일 수 있습니다.

컴퓨터에 직접 액세스 할 수 없으므로 문제가 무엇인지 파악하고 올바른지 식별하는 방법을 제안해야합니다. 반복적으로 진단 프로그램을 배포 할 수 없으므로 처음으로 철저히 조사해야합니다.

첫 번째 질문은 다음과 같습니다.이 상황을 초래할 수있는 데스크톱 정책, 네트워크 정책 또는 소프트웨어를 알고있는 사람이 있습니까? 두 번째 질문 : 정확히 무슨 일이 일어나고 있는지 진단하려면 어떻게해야합니까?

나는 또한 자동으로 시작하도록 설치되며 진행중인 것을 확인하고 다양한 정보를 기록하기 위해 다양한 조치를 취할 새로운 진단 서비스를 작성하려고합니다. 예 : IP 주소로 데이터베이스 서버가 (이 서버를 찾을 수 있는지 확인하기 위해)

  • 핑 데이터베이스

    • 실행 "에서 ipconfig/all을"(네트워크 연결이 있는지 확인합니다)
    • 반복 다음 단계를 이름
    • 확인 데이터베이스에 대한 SQL 연결을 만들
    • 합니다 (HKLM 레지스트리 나중에 업데이트되는 경우) 서버 이름을 포함하는 HKLM 레지스트리 키에 의해 서버 (이 작업을 시작할 때 알아보십시오) 몇 초마다.

    이 서비스를 설치하고 컴퓨터를 다시 시작한 다음 사용자가 로그인하면 진단 정보에 유용한 정보가 표시됩니다.하지만 누구나 더 좋은 생각이나 제안 사항이 있습니까?

    적절한 권한을 가진 사용자 계정으로 실행되도록 서비스를 변경해 보았지만 문제가 해결되지 않았습니다. 수동으로 시작할 때 서비스가 제대로 작동하기 때문에 로컬 시스템 계정에는 db 서버에 연결하는 데 충분한 권한이 있습니다. 그래서 this question과 같지 않습니다.

    업데이트 : 번거로운 컴퓨터는 Win XP를 실행 중입니다.

    UPDATE : this article 오류 코드의 좋은 토론을 준다 (26)

  • 답변

    2

    전에이 문제가 발생했습니다. 문제를 해결하는 방법은 시작 스레드가 데이터베이스에 연결될 때까지 종료되지 않는 것입니다. 우리는 매번 연결을 시도하고 우리가 연결할 수 없다는 사실을 기록합니다. 우리가 연결을 설정하면 우리는 서비스를 계속할 것입니다.

    다른 말로하면 서비스가 정상적으로 시작되지만 데이터베이스에 연결할 수 있는지를 알기 전까지는 작업을 수행하지 않아야합니다. 불필요한 로그 항목으로 시스템을 가득 채울 수 있으므로 모든 연결 실패를 기록하기로 결정한 경우주의하십시오. 서비스가 다시 시작되지 않는 한 첫 번째 연결 실패를 기록하고 다시는 실패하지 않습니다.

    물론 데이터베이스가 항상 로컬 서비스 인 경우 더 나은 솔루션은 데이터베이스 Windows 서비스에 대한 종속성을 만드는 것이지만 데이터베이스가 로컬 인 것처럼 들리지는 않습니다.

    +0

    에게 감사드립니다. 문제의 원인이 무엇인지 알아 냈습니까? – Rory

    +0

    우리에게있어 문제는 서비스가 시작될 때 데이터베이스 서버가 준비 될 것이라고 보장 할 수 없다는 것입니다. 우리의 데이터베이스는 현지 일 수도 있고 아닐 수도 있지만 우리는 상관하지 않습니다. 우리가 데이터베이스와 대화 할 수 없다면 우리의 서비스가 작동하지 않는다는 것을 알았습니다. 그래서 우리는 할 수있을 때까지 기다렸습니다. – Daniel

    2

    몇 가지 힌트 :

    1. 은 아마 당신은 SQL Server 또는 DTC (같은 다른 Windows 서비스에 서비스에서 의존성을 설정해야) 서비스가 시작되기 전에 이러한 서비스가 시작되는지 확인해야합니다. (실행중인 OS에 따라)

    2. 또 다른 옵션은 지연 자동 시작 서비스입니다 http://msdn.microsoft.com/en-us/magazine/cc164252.aspx

    3. 세 번째 옵션을 살펴 : 단순히 일부에 Thread.sleep (또는 폴링 루프)를 넣어 DB에 처음 연결하기 전에 서비스 스레드에 전달합니다.

    +0

    # 1 : 네트워크를 먼저 사용할 수 있도록하기 위해 일반 PC (SQL 또는 DTC가없는 서비스)에서 사용할 수있는 서비스는 무엇입니까? – Rory

    +0

    # 2 : 안타깝게도 XP # – Rory

    +0

    # 3처럼 불가능하지만 이상적으로는 문제의 원인을 파악하고이를 내 앱이 아니라 변경하고 싶습니다. 또는 둘 다 변경하십시오. – Rory

    3

    서비스가 시작될 때까지 아직 가동되지 않은 일종의 방화벽이이 컴퓨터에 설치되어있을 가능성이 있습니까? 서비스가 완전히 시작되고 트래픽을 제대로 모니터링 할 수있을 때까지 소프트웨어 방화벽이 인터넷 연결을 완전히 잠그는 경우가 있습니다.이 경우 방화벽이 방화벽보다 빠르게 시작되면 무엇을 볼 수 있습니까? 응용 프로그램에서 연결이 끊어진 네트워크로 나타납니다.

    +0

    가능합니다 - 관리자에게 – Rory

    관련 문제