Слишком много подключений Asp.net - PullRequest
0 голосов
/ 22 марта 2012

Я перевожу Foxpro в приложение ASP.NET MVC.

Почти 70% логики встроено в хранимые процедуры SqlServer. по этой причине мы используем некоторые процедуры для обновления некоторых таблиц (мы не отображаем SP, просто вызываем их, используя SqlConnection с SqlDataReader, SqlCommand, SqlAddapter).

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

Каков текущий способ закрытия и удаления каждого соединения?

Можно ли найти активное соединение и использовать его повторно?

Последняя попытка была:

SqlConnection.ClearAllpools();

Но это не дает немедленного эффекта. У нас есть соединение класса IDisposabel, которое выполняет соединения. Это метод de close:

public void close()
{
    SqlConnection.ClearAllPools();
    //.ClearPool(BdTransCx);
    // SqlConnection.ClearPool(BdArchCx);

    if (ConectarArchivos) 
    {
        if (BdArchCx.State == ConnectionState.Open)
        {
            BdArchCx.Close();
        }
    }
    if (BdArchCx.State == ConnectionState.Open)
    {
        BdTransCx.Close();
    }
}

Этот метод вызывается после каждого запроса.

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Соединения в .NET объединяются в пул, поэтому нормально видеть некоторые соединения, которые все еще активны в базе данных.

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

Просто убедитесь, что вы правильно закрыли каждое соединение и каждую команду, так что они возвращаются в бассейн.Вы можете использовать using блоки, чтобы убедиться, что они расположены правильно, что бы ни случилось:

using (SqlConnection connenction = ...) {
  using (SqlCommand command = ...) {
    ...
  }
}
2 голосов
/ 22 марта 2012

Вы должны обернуть свои SqlConnection объекты и любые SqlCommand объекты в using блок .

using (SqlConnection cn = new SqlConnection(connectionString))
{
    using (SqlCommand cm = new SqlCommand(commandString, cn))
    {
        cn.Open();
        cm.ExecuteNonQuery();
    }
} 

Подробнее см. "Ваш друг, использующий оператор C #. "

1 голос
/ 22 марта 2012

Обязательно сохраните Reader также в операторе использования, чтобы избежать проблемы с подключением

using (SqlConnection cn = new SqlConnection(connectionString))
{
    using (SqlCommand cm = new SqlCommand(commandString, cn))
    {
        cn.Open();
        using (IDataReader dr = cm.ExecuteReader())
        {
        }
    }
}
...