2012-02-14 2 views
7

내 DB에 conection을 닫지 않기 때문에 이것이라고 생각합니다. 내 데이터 플레이어에 대해 아래 코드를 사용하여 코드를 게시했습니다. 내 연결 부위를 닫아야합니까? 나는 그것을 어떻게 할 것인가? 이것이 문제의 원인이되는 코드입니까?최대 풀 크기에 도달 했습니까?

오류 코드 Heires :

제한 시간이 만료되었습니다. 풀에서 연결을 가져 오기 전에 시간 초과 기간이 경과했습니다. 이는 풀링 된 모든 연결이 사용 중이며 최대 풀 크기에 도달했기 때문에 발생했을 수 있습니다.

설명 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 정보는 스택 추적을 검토하십시오.

예외 정보 : System.InvalidOperationException : 시간 종료가 만료되었습니다. 풀에서 연결을 가져 오기 전에 시간 초과 기간이 경과했습니다. 이는 풀링 된 모든 연결이 사용 중이며 최대 풀 크기에 도달했기 때문에 발생했을 수 있습니다.

public DataTable getPictures() 
    { 

     //get database connection string from config file 
     string strConectionString = ConfigurationManager.AppSettings["DataBaseConnection"]; 

     //set up sql 
     string StrSql = "SELECT MEMBERS.MemberName, Picture.PicLoc, Picture.PicID, Picture.PicRating FROM Picture INNER JOIN MEMBERS ON Picture.MemberID = MEMBERS.MemberID WHERE (Picture.PicID = @n) AND (Picture.PicAproval = 1) AND (Picture.PicArchive = 0)AND (MEMBERS.MemberSex = 'F')"; 

     DataTable dt = new DataTable(); 
     using (SqlDataAdapter daObj = new SqlDataAdapter(StrSql, strConectionString)) 
     { 
      daObj.SelectCommand.Parameters.Add("@n", SqlDbType.Int); 
      daObj.SelectCommand.Parameters["@n"].Value = GetItemFromArray(); 

      //fill data table 
      daObj.Fill(dt); 
     } 
     return dt; 
    } 

public int GetItemFromArray() 
    { 
     int myRandomPictureID; 
     int[] pictureIDs = new int[GetTotalNumberOfAprovedPictureIds()]; 


     Random r = new Random(); 
     int MYrandom = r.Next(0, pictureIDs.Length); 

     DLPicture GetPictureIds = new DLPicture(); 
     DataTable DAallAprovedPictureIds = GetPictureIds.GetPictureIdsIntoArray(); 

     //Assign Location and Rating to variables 
     int i = 0; 
     foreach (DataRow row in DAallAprovedPictureIds.Rows) 
     { 

      pictureIDs[i] = (int)row["PicID"]; 
      i++; 
     } 

     myRandomPictureID = pictureIDs[MYrandom]; 
     return myRandomPictureID; 
    } 

public DataTable GetPictureIdsIntoArray() 
    { 
     string strConectionString = ConfigurationManager.AppSettings["DataBaseConnection"]; 

     //set up sql 
     string StrSql = " SELECT Picture.PicID FROM MEMBERS INNER JOIN Picture ON MEMBERS.MemberID = Picture.MemberID WHERE (Picture.PicAproval = 1) AND (Picture.PicArchive = 0) AND (MEMBERS.MemberSex ='F')"; 
     DataTable dt = new DataTable(); 
     using (SqlDataAdapter daObj = new SqlDataAdapter(StrSql, strConectionString)) 
     { 

      //fill data table 
      daObj.Fill(dt); 
     } 
     return dt; 

    } 

답변

3

나는 SqlDataAdapter가 자체적으로 연결을 처리한다고 생각합니다. 그러나 데이터 어댑터에 대한 복수의 back-to-back fill()의 경우 각 fill() 요청에서 연결을 여는 것이 더 좋습니다. 그 결과 데이터베이스 연결이 여러 번 열리고 닫힙니다.

직접 연결을 제어 할 수 있다고 생각합니다. 사용

using (SqlConnection cnn= new SqlConnection (strConectionString)) 
using (SqlDataAdapter daObj = new SqlDataAdapter(StrSql, cnn)) 
    { 
     daObj.SelectCommand.Parameters.Add("@n", SqlDbType.Int); 
     daObj.SelectCommand.Parameters["@n"].Value = GetItemFromArray(); 

     cnn.Open(); 

     //fill data table 
     daObj.Fill(dt); 

     cnn.Close(); 
    } 
1

이 줄을 채우십시오.

daObj.Dispose(); 

편집 : 은 또한 당신이 IIS에서 풀을 재활용 할 수 있습니다. 한 번 사용한 연결을 닫는 것이 가장 좋습니다.

+2

daObj 개체를 이미 {} 블록을 사용하여. Dispose()에 전화해야합니까? 그럴 필요가 없다고 생각합니다. –

0

는 Displose가 호출됩니다 확인합니다. 내가 게시 된 코드가 잘 생각

기본 최대 풀 크기 확인하시기 바랍니다 통합 보안을 사용하는 사용자에게보다 100

기록 가능성이없는 100입니다 연결 설정 파일의 충돌 DataBaseConnection에서 일부 설정 여부 풀. 참조 : http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.80).aspx

그리고 SqlDataAdapter 또는 SqlDataConnection 개체가 다른 위치에서 처리되지 않는지 확인하십시오. 당신은 당신이 효율적으로 연결을 처리 여부를 추측하지 않으려면

+0

다른 사람의 게시물에 댓글을 추가 할 수없는 이유는 무엇입니까? – findcaiyzh

2

, 당신은 열려있는 얼마나 많은 알려줄 수있는 쿼리를 실행할 수 있습니다

SELECT 
    DB_NAME(dbid) as DatabaseName, 
    COUNT(dbid) as ConnectionCount, 
    loginame as LoginName 
FROM 
    sys.sysprocesses 
WHERE 
    dbid > 0 
GROUP BY 
    dbid, loginame 
order by count(dbid) desc 
관련 문제