2009-02-06 5 views
0

스레드를 잠자기 상태로 만들거나 보내지 말아야하는 매우 동시적인 CCR 응용 프로그램을 설계하고 있습니다. 나는 잠재적으로 시간의 전체 손을 재 시도 할 수 SqlConnection.OpenSQLConnection 풀링 - InvalidOperationExceptions 처리

를 호출하려고 할 때 특히 InvalidOperationExceptions을 받고 있지만, 이것은 정말 문제를 해결하지 않습니다 -

나는 SQLConnection을 풀 문제를 타격하고있다.

나를 위해 이상적인 솔루션은 주기적으로 스레드가

어떤 아이디어 묶여 되 필요하지 않습니다 적용 여부에 대한 연결을 검사 다시하는 방법이 있을까요?

[업데이트] 다음은이 솔루션은 수동으로 관리되는 연결 풀을 필요로 another forum

에 게시 관련 문제/솔루션입니다. 차라리 더 역동적 인 솔루션을 필요로 할 때 필요합니다.

+0

코드 샘플주세요. –

+0

나는 이것이 CCR의 일반적인 문제라고 생각한다. CCR에 익숙하다면 코드 샘플이 도움이되지 않는다. –

답변

1

해리, CCR을 사용하면서도이 문제를 해결했습니다. 내 경험으로는 디스패처 스레드를 모든 I/O에서 차단하지 못하게함으로써 SqlConnection 풀이 처리 할 수있는 것보다 훨씬 빠르게 작업 항목을 소비하고 처리 할 수있었습니다. maximum-pool-limit에 도달하면, 나는 당신이보고있는 종류의 오류를 만났다.

가장 간단한 해결 방법은 풀링되지 않은 비동기 SqlConnection 개체를 미리 할당하고 일부 중앙 포트 <SqlConnection> 개체에 게시하는 것입니다. 당신이 명령을 실행해야 할 때마다 그런 다음,이 같은 뭔가 반복자 이내에 수행

public IEnumerator<ITask> Execute(SqlCommand someCmd) 
{ 
    // Assume that 'connPort' has been posted with some open 
    // connection objects. 
    try 
    { 
     // Wait for a connection to become available and assign 
     // it to the command. 
     yield return connPort.Receive(item => someCmd.Connection = item); 

     // Wait for the async command to complete. 
     var iarPort = new Port<IAsyncResult>(); 
     var iar = someCmd.BeginExecuteNonQuery(iarPort.Post, null); 
     yield return iarPort.Receive(); 

     // Process the response. 
     var rc = someCmd.EndExecuteNonQuery(iar); 
     // ... 
    } 
    finally 
    { 
     // Put the connection back in the 'connPort' pool 
     // when we're done. 
     if (someCmd.Connection != null) 
      connPort.Post(someCmd.Connection); 
    } 
} 

CCR을 사용에 대한 좋은 점은 코드의 기본적인 부분에 다음과 같은 기능을 추가하는 사소한 점이다 .

  1. 타임 아웃 - 사용 가능한 연결에 대한 초기 수신을 제한 시간 포트와 함께 '선택'으로 만듭니다.
  2. 동적으로 풀 크기를 조정하십시오. 풀 크기를 늘리려면 새로운 'SqlConnection'을 'connPort'에 게시하십시오. 풀 크기를 줄이려면 connPort에서 수신을 생성 한 다음 수신 된 연결을 닫고 버립니다.
+0

답장을 보내 주셔서 감사합니다. Nick. 그럼 그 연결을 열어두고 있니? –

0

예, 연결은 연결 풀에서 열어 두었습니다. 위의 예에서 포트 입니다.