Моя бизнес-логика реализована в простых статических классах со статическими методами. Каждый из этих методов открывает / закрывает соединение SQL при вызове:
public static void DoSomething(string something)
{
using (SqlConnection connection = new SqlConnection("..."))
{
connection.Open();
// ...
connection.Close();
}
}
Но я думаю, что отказ от открытия и закрытия соединения снижает производительность . Давным-давно я провел несколько тестов с классом OleDbConnection (не уверен насчет SqlConnection), и это определенно помогло работать вот так (насколько я помню):
//pass the connection object into the method
public static void DoSomething(string something, SqlConnection connection)
{
bool openConn = (connection.State == ConnectionState.Open);
if (!openConn)
{
connection.Open();
}
// ....
if (openConn)
{
connection.Close();
}
}
Итак, вопрос в том, что выбрать: метод (а) или метод (б)? Я читал в другом вопросе stackoverflow, что пул соединений сохранил для меня производительность, мне вообще не нужно беспокоиться ...
PS. Это приложение ASP.NET - соединения существуют только во время веб-запроса. Не беспроигрышное приложение или сервис.
c#
sqlconnection
Alex
источник
источник
DbConnection.StateChange
событие для отслеживания изменений в изменении состояния соединения (и может храниться локально) вместоDbConnection.State
непосредственной проверки свойства. Это сэкономит вам затраты на производительность.Ответы:
Придерживайтесь варианта а .
Пул соединений - ваш друг.
источник
Используйте метод (а) каждый раз. Когда вы начнете масштабировать свое приложение, логика, которая имеет дело с состоянием, станет настоящей головной болью, если вы этого не сделаете.
Пул соединений делает то, что написано на олове. Только подумайте, что происходит, когда приложение масштабируется, и насколько сложно вручную управлять состоянием открытия / закрытия соединения. Пул соединений отлично справляется с этой задачей автоматически. Если вас беспокоит производительность, подумайте о каком-то механизме кеширования памяти, чтобы ничего не блокировалось.
источник
Всегда закрывайте соединения, как только вы закончите с ними, чтобы их базовое соединение с базой данных могло вернуться в пул и быть доступным для других вызывающих абонентов. Пул соединений довольно хорошо оптимизирован, поэтому заметных штрафов за это нет. Совет в основном тот же, что и для транзакций - держите их короткими и закрытыми, когда закончите.
Это становится более сложным, если вы сталкиваетесь с проблемами MSDTC, используя одну транзакцию вокруг кода, который использует несколько подключений, и в этом случае вам действительно нужно предоставить общий доступ к объекту подключения и закрыть его только после завершения транзакции.
Однако здесь вы все делаете вручную, поэтому вы можете изучить инструменты, которые управляют подключениями за вас, например DataSets, Linq to SQL, Entity Framework или NHibernate.
источник
Отказ от ответственности: я знаю, что это устарело, но я нашел простой способ продемонстрировать этот факт, поэтому вкладываю свои два цента.
Если вам сложно поверить в то, что объединение в пул действительно будет быстрее, попробуйте следующее:
Добавьте где-нибудь следующее:
Теперь замените все вызовы на
Open()
наTimedOpen()
и запустите вашу программу. Теперь для каждой отдельной строки подключения, которая у вас есть, окно консоли (вывода) будет иметь одно открытое длительное время и несколько очень быстро открывающихся.Если вы хотите пометить их, вы можете добавить их
new StackTrace(true).GetFrame(1) +
к вызовуWriteLine
.источник
Есть различия между физическими и логическими соединениями. DbConnection - это своего рода логическое соединение, использующее базовое физическое соединение с Oracle. Закрытие / открытие DbConnection не влияет на вашу производительность, но делает ваш код чистым и стабильным - утечки соединения в этом случае невозможны.
Также следует помнить о случаях, когда существуют ограничения для параллельных подключений на сервере db - с учетом этого необходимо делать ваши подключения очень короткими.
Пул соединений освобождает вас от проверки состояния соединения - просто откройте, используйте и сразу же закройте.
источник
например, когда пользователь выполняет действие по начислению, ваше приложение должно сначала найти баланс пользователя и обновить его, они должны использовать то же соединение.
Даже если у ado.net есть свой пул соединений, стоимость диспетчерского соединения очень низкая, но соединение с повторным использованием - более лучший выбор.
Поскольку соединение блокируется, когда вы выполняете какой-либо запрос или команду, это означает, что ваше приложение выполняет только одну операцию с базой данных в одно и то же время, насколько это низкая производительность.
Еще одна проблема заключается в том, что ваше приложение всегда будет иметь соединение, даже если ваш пользователь просто открывает его, но не выполняет никаких операций.Если ваше приложение открыто много пользователей, сервер базы данных скоро будет стоить весь его источник подключения, в то время как ваши пользователи этого не сделали что-нибудь.
источник