2011-03-28 4 views
2

나는 C# 코드를 작성하고 LINQ 및 일부 저장 프로 시저를 사용하여 연결을 열거 나 닫을 때주의를 기울이지 만 계속이 오류가 발생합니다.제한 시간이 만료되었습니다.

Timeout expired. 
The timeout period elapsed prior to obtaining a connection from the pool. 
This may have occurred because all pooled connections were in use and max pool size was reached. 

이 오류가 발생한 경우를 제외하고 코드가 완벽하게 작동합니다. 어떻게해야합니까?

어떤 아이디어 주셔서 감사합니다. 코드를보고 난 후에

public static List<int> GetIslemIdleribySPbyCariId(int cariId) 
    { 
     string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString; 

     SqlConnection sqlConn = new SqlConnection(connString); 
     sqlConn.Open(); 

     List<int> islemidleri = new List<int>(); 
     islemidleri.Clear(); 

     SqlCommand cmd; 
     cmd = new SqlCommand("GetIslemIdleri", sqlConn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add(new SqlParameter("@CARIID", cariId)); 

     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       islemidleri.Add(reader.GetInt32(0)); 

      } 
      cmd.Parameters.Clear(); 
     } 

     sqlConn.Close(); 

     return islemidleri; 

    } 
    /// <summary> 
    /// SP kullanarak dovizturlerini döndürür 
    /// </summary> 
    /// <returns>string listesi döndürür için döviz türleri var TL, USD vs.</returns> 
    public static List<string> GetDovizTurleribySP() 
    { 
     string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString; 

     SqlConnection sqlConn = new SqlConnection(connString); 
     sqlConn.Open(); 

     List<string> dovizTanimlari = new List<string>(); 

     string commandGetDovizTanimlari = "EXEC GetDovizTanimlari"; 
     SqlCommand cmd; 
     cmd = new SqlCommand(commandGetDovizTanimlari, sqlConn); 

     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       dovizTanimlari.Add(reader.GetString(0)); 
      } 

     } 
     return dovizTanimlari; 

    } 
+1

연결을 관리하는 방법을 보여주는 코드를 보여줄 수 있습니까? –

+0

@Chris Taylor 방금 Mr.Taylor 코드를 추가했습니다. – Bastardo

답변

3

코드에서 사용자는 GetDovizTurleribySP 함수로 연결을 종료하지 않습니다. 예외가 발생해도 연결이 닫히는 지 확인하려면 using 문을 사용하는 것이 좋습니다.

그것은이

public static List<string> GetDovizTurleribySP() 
{ 
    string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString; 

    using (SqlConnection sqlConn = new SqlConnection(connString)) 
    { 
    sqlConn.Open(); 

    List<string> dovizTanimlari = new List<string>(); 

    string commandGetDovizTanimlari = "EXEC GetDovizTanimlari"; 
    SqlCommand cmd; 
    cmd = new SqlCommand(commandGetDovizTanimlari, sqlConn); 

    using (var reader = cmd.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
     dovizTanimlari.Add(reader.GetString(0)); 
     } 

    } 
    return dovizTanimlari; 
    } 
} 
+0

Mr.Taylor, 고맙습니다. 누락 된 sqlConn.Close()를 보았습니다. 그리고 내가 "사용"을 사용하면 코드에서 이해하는만큼 sqlConn.Close()를 작성하지 않아도됩니까? – Bastardo

+1

@EmreVeriyaz, 맞습니다. using 문은 try/finally에 코드를 실제로 래핑하고 using 문에서 참조하는 객체에서 Dispose 메서드를 호출합니다. 이렇게하면 코드가 예외 또는 초기 반환 등으로 인해 함수의 끝에 도달하지 않아도 연결이 끊어집니다. DataReader에 대해 동일한 개념을 사용하고, 일단 독자가 그것으로 끝난다. 그것은 좋다. –

1

내가 지적하고 싶은 2 가지 프로그래머, 문을 사용하여 귀하의 SqlCommand를, DataReader를하고 SQLConnection을 포장 (예 문을 사용하여 중첩) 및 목록을 만들 때 또한 명확 호출 할 필요가 없습니다() 이후에 목록을 이미 emtpy로 초기화해야합니다 (적어도 C#에서 그렇게 생각합니다).

+0

나는 이것을 이렇게 사용하지 않았지만 지금 당장 시도 할 것이다. – Bastardo

+0

감사합니다. 내 코드를 다시 작성합니다. 그리고 오류가 발생했다는 것을 알았습니다. dovizTanimlari;를 반환하기 전에 sqlConn.Close()가 누락되었습니다. :) – Bastardo

+1

어디서 진술을 사용하면 예외가 발생하더라도 모든 것이 닫히고 정리되므로 논리 오류가 없음을 의미합니다. –

0

테스트 같은 테스트를 볼 수 있습니다 다른 사람의 사이에서, 마지막으로 내가 발견, 표현을 사용

Close(); 
Dispose(); 
SqlConnection.ClearPool(connection); 
SqlConnection.ClearAllPools(); 

각에 대한 "열기 풀"의 문제 OpenConnection은 ASP.NET 클라이언트 응용 프로그램에서 포화 상태를 일으키는 "풀"유지 보수 (AWAITING COMMAND)를 재사용하지 않습니다 (유일한 방법은 IIS를 다시 시작하는 것입니다). 그 연결 문자열은 .config 파일의 호출입니다.

*System.Configuration.ConfigurationManager.ConnectionStrings ["ConnectionSQL"] ConnectionString.;* 

분명히 그는 외부 어셈블리를 호출하여 연결 문자열 또는 해시에 "차이"를 일으킨 것 같습니다.

해결책 :

System.Configuration"** and replacement implicitly invoking: ConfigurationManager.ConnectionStrings ["ConnectionSQL"] ConnectionString; 

이 더 이상 "풀"은 각각 "열기()"에 의해 실행 된 문제를 해결 :

나는 어셈블리를 추가했다.

관련 문제