Ошибка максимального размера пула была достигнута? - PullRequest
7 голосов
/ 14 февраля 2012

Я думаю, это потому, что я не закрываю связи с моей БД. Я разместил код, который я использую ниже для моего 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;

    }

Ответы [ 4 ]

3 голосов
/ 14 февраля 2012

Я считаю, что SqlDataAdapter обрабатывает соединение самостоятельно.Тем не менее, в случае нескольких параллельных переходов 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();
    }
2 голосов
/ 06 августа 2015

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

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
1 голос
/ 14 февраля 2012

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

daObj.Dispose();

EDIT: Также вы можете перерабатывать пул в IIS. но лучше всего разомкнуть соединение, когда-то использованное.

0 голосов
/ 14 февраля 2012

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

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

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

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

...