Ошибка: достигнут максимальный размер пула?

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

Вот код ошибки:

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

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

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

    }

person CsharpBeginner    schedule 14.02.2012    source источник


Ответы (4)


Я считаю, что 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();
    }
person Pongsathon.keng    schedule 14.02.2012

добавить эту строку после заливки.

daObj.Dispose();

РЕДАКТИРОВАТЬ: Также вы можете перерабатывать пул в IIS. но лучше всего закрыть соединение после использования.

person AJP    schedule 14.02.2012
comment
Объект daObj уже использует блок {}. Нам нужно вызвать Dispose ()? Думаю, этого делать не нужно, - person Pongsathon.keng; 14.02.2012

Если вы не хотите угадывать, эффективно ли вы обрабатываете соединения, вы можете запустить запрос, чтобы узнать, сколько из них открыто:

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
person Jon Crowell    schedule 06.08.2015

использование гарантирует, что Displose будет вызываться. Я думаю, что опубликованный код в порядке

Максимальный размер пула по умолчанию - 100. Маловероятно, что при использовании встроенной безопасности и зарегистрированных пользователей больше 100.

Пожалуйста, проверьте, не конфликтуют ли некоторые настройки в DataBaseConnection в файле конфигурации с пулом соединений. обратитесь к: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring%28v=vs.80%29.aspx

И проверьте, не размещен ли объект SqlDataAdapter или SqlDataConnection в других местах.

person findcaiyzh    schedule 14.02.2012
comment
Почему я не могу добавить комментарий к чужому сообщению? - person findcaiyzh; 14.02.2012