Пул подключений - PullRequest
       27

Пул подключений

4 голосов
/ 26 апреля 2010

У меня есть следующий код: если я использую conn == null, наконец, я все еще использую пул соединений? Я знаю, что это хорошая практика - закрывать ваше соединение, но как насчет удаления всего объекта соединения?

    public void ExecuteNonQuery(SqlCommand Cmd)
    {
        //========== Connection ==========//
        SqlConnection Conn = new SqlConnection(strConStr);

        try
        {
            //========== Open Connection ==========//
            Conn.Open();

            //========== Execute Command ==========//
            Cmd.Connection = Conn;
            Cmd.CommandTimeout = 180;
            Cmd.ExecuteNonQuery();
        }
        catch (Exception Exc)
        {
            throw Exc;
        }
        finally
        {
            //======== Closing Connection ========//
            if (Conn.State == ConnectionState.Open)
            { Conn.Close(); }

            //======== Disposing object ========//
            Conn = null;
        }
    }

Ответы [ 4 ]

6 голосов
/ 26 апреля 2010

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

public void ExecuteNonQuery(SqlCommand Cmd) 
{ 
    //========== Connection ==========// 
    using(SqlConnection Conn = new SqlConnection(strConStr))
    { 
        //========== Open Connection ==========// 
        Conn.Open(); 

        //========== Execute Command ==========// 
        Cmd.Connection = Conn; 
        Cmd.CommandTimeout = 180; 
        Cmd.ExecuteNonQuery(); 
    } 
} 
4 голосов
/ 26 апреля 2010
  • Вам не нужно ничего устанавливать на ноль или ничего в .NET. Это автоматически обрабатывается сборщиком мусора .

  • Обязательно, чтобы вы вызывали Conn.Dispose () как в обработке ошибок, так и в том случае, если все идет по плану. Блок Try Catch finally отлично подходит для этого. Другой альтернативой является использование ключевого слова Using при объявлении вашего соединения, чтобы объект Connection был должным образом избавлен от всего, что происходит.

  • Не беспокойтесь о пуле ваших соединений. Если вы открываете новый каждый раз, когда вам нужно его использовать, это нормально. ADO.NET объединяет для вас соединения за кулисами. Если вы повторно используете один и тот же объект открытого соединения, производительность будет незначительной, но для простоты не беспокойтесь об этом.

Вы можете сделать то же самое с помощью следующего кода. Результат будет таким же. Будь то ошибки или нет, Conn будет обработан правильно. Любая ошибка просачивается, как и раньше.

public void ExecuteNonQuery(SqlCommand Cmd)
{
    Using (SqlConnection Conn = new SqlConnection(strConStr));
    {
        //========== Open Connection ==========//
        Conn.Open();

        //========== Execute Command ==========//
        Cmd.Connection = Conn;
        Cmd.CommandTimeout = 180;
        Cmd.ExecuteNonQuery();
    }
}

Как вы можете видеть, когда единственная обработка ошибок, которую вы хотите / нуждаетесь, состоит в том, чтобы убедиться, что ваши объекты подключения правильно утилизируются, синтаксис Using может привести в порядок.

0 голосов
/ 26 апреля 2010

Вы можете распоряжаться своим объектом и по-прежнему использовать пул.

А также его

  1. Управляемое приложение
  2. Это веб-приложение
  3. Имеет интенсивный трафик

Тогда утилизация объекта окажет вам большую услугу, поскольку сборщик мусора обычно не справляется с задачей, чтобы сохранить производительность.

0 голосов
/ 26 апреля 2010

Установка его в null избыточна, так как он все равно выйдет из области видимости в конце функции. Да, вы все еще используете пул соединений, если вы это делаете.

...