2012-11-13 5 views
2

내 프로젝트는 우리 서버에서 몇 가지 프로세스를 시작하기 위해 C#으로 작은 Windows 서비스를 작성했습니다. 새 서비스는 MSSQLSERVER 서비스에 종속되며 사용자 세션 내에서 작동 할 때 안정적으로 시작/실행/중지됩니다.Try/Catch에서 ExecuteReader를 포함하면 성공하게됩니까?

부팅시에는 제한된 성능의 하드웨어가 매우 사용량이 많아서 MSSQLSERVER가 서비스 제어 관리자에게 '시작됨'으로보고했지만 쿼리를 처리 할 준비가되지 않은 것 같습니다. 따라서 SQLConnection을 열면 "가끔"(약 50/50)을 쿼리하는 첫 번째 시도가 실패합니다.

rdr = cmd.ExecuteReader(); 

을하고 1 초 지연과 시도/캐치에 배치하고 최대 다시 시도하자

내이 문제를 해결하는 (일반적으로 인정 하듯이 무딘) 접근 방식은 내가 실패 믿고 ExecuteReader 메서드을하는 것이 었습니다 10 번 :이 방법은 완벽하게 작동하고 모든 시간을 시작하도록 서비스를 할 수 있지만 내가 이벤트 로그를 확인하면

 bool bReady = false; 
     int iErrCount = 0; 
     while (bReady == false && iErrCount < 10) 
     { 
      try 
      { 
       System.Threading.Thread.Sleep(1000); 
       rdr = cmd.ExecuteReader(); 
       bReady = true; 
       EventLog.WriteEntry("Starting...",EventLogEntryType.Information); 
      } 
      catch 
      { 
       bReady = false; 
       iErrCount += 1; 
       EventLog.WriteEntry("Failed once...",EventLogEntryType.Warning); 
      } 
     } 

     if (bReady == false) 
     { 
      EventLog.WriteEntry("Failed ten times. Service will now exit.",EventLogEntryType.Error); 
      return; 
     } 

내 quandry는, 실제로는 항상 첫 번째 시도에서 성공한다! 지금 잡으려고하는 예외는 결코 발생하지 않습니다. Try/Catch 내부에서 메서드 호출을 배치하는 방법은 성공 가능성에 영향을 미쳤습니다.

모든 의견을 환영합니다.

+2

문제가 무엇인지 알아 내고 문제를 해결하는 방법은 무엇입니까? try {executeReader();} catch (Exception ex) {EventLog.WriteEntry (ex.ToString());}'? –

+0

"실패"하면 어떤 예외가 있습니까? –

+0

그냥 짐작할 만하지 만 그 이유는 .NET의 성능 최적화 일 수 있습니다. 여기를 참고하십시오 : [http://msmvps.com/blogs/peterritchie/archive/2007/06/22/performance-implications-of-try-catch-finally. aspx] (http://msmvps.com/blogs/peterritchie/archive/2007/06/22/performance-implications-of-try-catch-finally.aspx) – Ondra

답변

1

물론 이전에 없었던 Thread.Sleep을 추가하지 않았습니까?

System.Threading.Thread.Sleep(1000); 
rdr = cmd.ExecuteReader(); 

이전에 없었던 경우 이제 연결을 시도하기 전에 잠자고 있습니다. 어쩌면 그게 전부 일거야.

+0

감사합니다. 호르헤. 나는 내가 원하는만큼 많이 테스트하지 못했다. 테스트 환경에 빌드를 가져 오는 데는 시간이 걸리고 b). 실용적인 테스트 방법은 전체 서버를 다시 시작하는 것입니다.하지만 시간이 걸리지 만 제한된 테스트는 1 초의 대기 시간 없이도 Try/Catch 내부에 명령을 두는 것으로 나타났습니다. – dameslap

관련 문제