2009-08-31 4 views
0

무한 루프와 thread.sleep을 사용하는 Windows 서비스가 있습니다. 스레드의 절전 시간은 10 초입니다.VB.net Windows 서비스 응답 시간

서비스가 처음 시작될 때 (SQL에 데이터가 있음) 작업이 수행되면 즉시 처리됩니다. 작업을 수행하는 한 계속해서 반응 형이며 10 초마다 작업을 처리합니다. . 장기간 (예 : 15-20 분) SQL에 데이터가 없으면 서비스가 매우 느리게 응답하기 시작합니다. 결국 데이터를 선택하여 처리하지만 10 초가 아닌 10 분이 소요됩니다.

코드에 서비스가 잠자기 상태임을 나타내는 논리가 없습니다. 어떤 아이디어?

+1

어떤 일이 벌어지는 지 알 수 있도록 코드 스 니펫을 게시 할 가능성이 있습니까? – twlichty

답변

0

코드를 보지 않고는 명확한 답을 내릴 수 없습니다. 데이터베이스 연결을 신속하게 정리하지 않는 경우에 일 수 있습니다.

당신이 뭔가를 한 경우 :

While(True) 
     Dim con as new SqlConnection(connectionString) 
     con.Open() 

     Dim cmd as New SqlCommand("usp_getJob", con) 
     cmd.CommandType = CommandType.StoredProcedure 

     Dim dr as SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult Or CommandBehavior.SingleRow Or CommandBehavior.CloseConnection) 
     If(dr.Read()) 
      DoSomething(dr) 
     Else 
      Thread.Sleep(10) 
     End If 
    End While 

... 그때는 빨리 그들 자신에 의해 멀리 갈 것보다 연결을 엽니 다.

여러 대체있다, 나는 연결이 가능한 한 빨리 연결 풀에 반환 할 수 있도록 Using 블록을 사용하여 옹호 것 :

While(True) 
     Using con as new SqlConnection(connectionString) 
      con.Open() 

      Using cmd as New SqlCommand("usp_getJob", con) 
      cmd.CommandType = CommandType.StoredProcedure 

      Using dr as SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult Or CommandBehavior.SingleRow Or CommandBehavior.CloseConnection) 
       If(dr.Read()) 
        DoSomething(dr) 
        dr.Close() 
       Else 
        Thread.Sleep(10) 
       End If 
      End Using 
      End Using 
     End Using 
    End While 

이 다음 SqlDataReaderDispose()를 호출합니다 SqlConnection을 및 SqlCommand - 처음 두 중 하나는 연결이

0

가 완전히 이것에 로우 랜드에 동의 (우리가 가까이에 CloseConnectionSqlDataReader을 요청했습니다 주어진) 연결 풀에 공개되도록 할 것 하나. 코드를 보지 않으면 결정하기가 어려울 지 모르지만 대부분의 경우는 db 코드입니다.