2013-06-06 3 views
2

연결 시도의 남은 시간 초과가 여러 시도를 통해 지속되는 것 같은 이상한 문제가 발생했습니다.SqlConnection 제한 시간 초과가

연결 및 취소 버튼을 사용하여 연결 정보를 입력하는 간단한 창이 있습니다. 사용자 히트 연결하면

다음 코드를 실행 :

private async Task ConnectToServer() 
{ 
    //using (((MainWindow)Owner).myConnection) 
    //{ 
     await ((MainWindow)Owner).myConnection.OpenAsync(); 
    //} 
} 

Timeout 속성 테스트의 목적으로 지금 작 :

DisableControls(); 
if((bool)AutoAuthenticated.IsChecked) 
{ 
    ((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection 
              ("server="+ServerName.Text + ";"+ 
              "Trusted_Connection=yes;" + 
              "database="+DatabaseName.Text + ";" + 
              "connection timeout=3"); 
} 
else 
{ 
    ((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection 
    ("user id="+UserName.Text+";" + 
    "password="+Password.Password+";" + 
    "server="+ServerName.Text+";" + 
    "Trusted_Connection=no;" + 
    "database="+DatabaseName.Text+";" + 
    "connection timeout=3"); 
} 

await ConnectToServer(); 

이것은 ConnectToServer 함수이다. 사용자가 안타

어쨌든,이 연결 동안 취소 버튼 : 나는 가짜 세부 사항을 입력하면, 이제

private void Cancel_Click(object sender, RoutedEventArgs e) 
{ 
    if (((MainWindow)Owner).myConnection != null && 
     ((MainWindow)Owner).myConnection.State == 
      System.Data.ConnectionState.Connecting) 
    { 
     ((MainWindow)Owner).myConnection.Close(); 
     EnableControls(); 
    } 
    else 
    { 
     this.Close(); 
    } 
} 

및 시간 제한을두고, 그럼 내가 네트워크 경로를 찾을 수 없습니다 '와 예외를 catch . '

취소 버튼을 얼마나 빠르게 누르는가에 따라 다음 시도 이후에 다시 연결을 시도하면 연결 버튼을 누른 후 거의 즉시 시간 초과됩니다. 그것이 예정되었던 시간.

내가 여기서 잘못하고 있는지 잘 모르겠다. SqlConnection 개체를 재설정하려고했지만 SqlConnection에 연결할 때마다 새 SqlConnection에 대한 설정이 이미 이루어져야한다고 생각했다. ?

+0

이것은 async-await과 아무런 관련이 없습니다. 맞습니까? SqlConnection.OpenAsyc 대신 SqlConnection.Open()을 호출하면 똑같은 일이 발생합니다. 맞습니까? –

+0

해당 연결 문자열 건물 코드로 몇 개의 문자열을 작성하고 있는지 알고 계십니까? [string.Format] (http://msdn.microsoft.com/library/System.String.Format.aspx) 또는 [StringBuilder] (http://msdn.microsoft.com/library/System.Text. StringBuilder.aspx)은 큰 이점이 될 것이지만 SQL 연결 문자열을 구체적으로 작성하고 있으므로 [SqlConnectionStringBuilder] (http://msdn.microsoft.com/library/System.Data.SqlClient.SqlConnectionStringBuilder.aspx) –

+0

'OpenAsync()'를 사용하여 응용 프로그램이 연결을 시도하는 동안 잠기지 않도록했습니다. 나는 방금 테스트를했고 방금 Open()을 사용하면 같은 일이 발생합니다.또한, '얼마나 많은 문자열을 만드는지 알고 계신가요?'라고 말하면, 내가 말하는 것이 어떻게 도움이 될지 모르겠습니다. 전달 된 매개 변수는 변경 될 수 있으므로 어쨌든이 함수가 호출 될 때마다 문자열을 다시 작성합니다. – Interminable

답변

1

제가 누락 된 부분을 발견했습니다. 연결을 닫을 때, 객체를 폐기 할 때조차도 using 문에서 모든 것을 유지하면서, 내가 인식하지 못했던 다른 요소 인 연결 풀이 있었기 때문에 문제가 지속되었습니다.

난 아직이에 대한 몇 가지 독서를해야하지만, 기본적으로는, 자원 절약 등 기존 연결 정보를 재사용 등

있습니다 자세한 내용은 here는하지만 경우에이 비슷한 문제를 가진 다른 사람을 도움 , 당신이 연결을 닫을 때 ClearPool() 함수를 호출 :

예 (내 예외 처리 코드에서, 나는 전화 후) (닫기) :

자원 사용 PE에서 분명히
System.Data.SqlClient.SqlConnection.ClearPool(((MainWindow)Owner).myConnection); 

만약 당신이 그 연결을 재사용 할 필요가 없을 때에 만 그 함수를 호출하는 것이 가장 좋을 것이라고 말했지만, 나는 이것을 읽을 필요가있다.

+0

웹 응용 프로그램과 같은 다중 스레드 응용 프로그램처럼 .ClearPool()을 호출하면 다른 스레드에서 여전히 활성/사용중인 풀의 연결이 재설정 될 수 있습니다. 아마도 동기 연산으로 연결을 여는 것이 더 좋을 것이며 더 높은 수준의 추상화를 기다리는 것이 좋습니다. 그것은 단지 큰 덩어리로 작업을하고 있습니다. –

+0

그러나 UI를 방해하지 않는 방식으로 계속하고 싶습니다. 사용자는 컨트롤을 사용하지 않도록 설정하므로 한 번에 둘 이상의 연결을 열 수 없습니다. 기다리는 것은 이벤트 (연결 버튼 클릭)에서 발생하므로, 내가 얼마나 더 높일 수 있는지 잘 모르겠습니다. 또한, 어쨌든 Sqlconnection 객체를 사용하는 다른 연결을 어떻게 가질 수 있습니까? 나는 하나의 Sqlconnection만을 사용할 수 있다고 생각했는데 ... 한 번에 둘 이상의 연결을 원한다면 하나 이상의 Sqlconnection 객체가 필요할 것이다. – Interminable

+0

그리고'ClearPool()'에 대한 호출은 내가 통과해야하는 SqlConnection 객체에만 영향을 주어야합니까? 나는 ClearAllPools()를 호출하지 않을 것이다. – Interminable