Шаблоны проектирования для SqlConnection, пулов соединений и единиц работ - PullRequest
3 голосов
/ 22 ноября 2011

Понятно, что SqlConnections объединены, поэтому ключевое слово using кажется идеальным, и этот подход я всегда использовал и видел использованным.

Например ...

public List<string> MyQuery()
{
    List<string> list = new List<string>();
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        // do some stuff with connection, process the resultset and fill the list.
    }
    return list;
}

Вопрос в следующем: с несколькими запросами к веб-странице, лучше ли каждый раз создавать соединение или делить соединение между запросами, разделяя его на единицу работы?

Производительность будет намного выше или это просто преждевременная ненужная микрооптимизация?

Действительно ли важно как можно скорее закрыть каждое соединение или лучше попытаться объединить все запросы в единицу работы?

Примером единицы работы может быть, например ...

List<string> list1, list2;
string myvalue1, string myvalue2;

using (SqlConnection conn = new SqlConnection(connection))
{
    list1 = MyQuery1(conn);
    list2 = MyQuery2(conn);
    myvalue1 = MyQuery3(conn);
    myvalue2 = MyQuery4(conn);
}

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

Ответы [ 3 ]

3 голосов
/ 22 ноября 2011

Обратите внимание, что с пулом соединений вы фактически не создаете новые соединения с каждым «новым» ... вы, как правило, просто получаете одно из пулов.

Таким образом, вы должны всегда открывать соединения как можно раньше и закрывать их как можно раньше.

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

Даже если между этими командами нет другого кода ... что если между ними происходит переключение контекста потока? Ваш объект подключения без необходимости открыт, ничего не делает, ждет возвращения контроля.

Если бы вы закрыли его, он мог бы вернуться в бассейн.

2 голосов
/ 22 ноября 2011

Есть хорошая ссылка от Microsoft http://msdn.microsoft.com/en-us/library/ms971481.aspx, часть «Использование подключений».

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

2 голосов
/ 22 ноября 2011

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

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

...