2012-02-14 3 views
7

Я думаю, что это потому, что я не закрываю связи с моей БД. Я написал код im, используя ниже для моего Datalayer. Мне нужно закрыть мой коннект? Как мне это сделать? Это код вызывает проблемы?Ошибка максимального размера пула?

Heres код ошибки:

Время ожидания истекло. Период ожидания истекает до получения соединения из пула. Возможно, это произошло из-за того, что все объединенные соединения использовались и максимальный размер пула был достигнут.

Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении: 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(); 

EDIT: Также вы можете переработать пул в 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 
Смежные вопросы