Каковы лучшие практики по управлению подключениями к базам данных в .NET? - PullRequest
10 голосов
/ 15 июля 2010

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

Однако, у меня есть некоторые специфические курьезы:


1.У меня есть два экземпляра бизнес-объектов разных классов в отношениях родитель-потомок (дочерний объект является личным.) Что из нижеперечисленного лучше?

  • Оставить один личныйоткрытое и совместно используемое статическое соединение, используемое обоими объектами и оставленное открытым до тех пор, пока родительский объект не будет удален.

  • Держите два частных статических соединения открытыми, по одному для каждого объекта, не закрывайте доОбъект расположен.

  • Не сохранять статические соединения;открыть и затем закрыть новое соединение для каждого метода, который требует этого.Однако большинство моих методов запускают только 1-3 запроса, так что это кажется неэффективным ...?


2.Мой второй вопрос по сути тот же, но для одной формы.Что лучше здесь?

  • Оставьте одно частное статическое соединение открытым и общим на весь срок действия формы.

  • Не сохраняйтестатическое соединение;открыть и затем закрыть соединение для каждого метода в форме, которая требует его (опять же, всего 1-3 запроса на метод.)

Ответы [ 4 ]

12 голосов
/ 15 июля 2010

(Был комментарий) ...

Теория заключается в том, что вы не должны обращаться к базе данных из своей бизнес-логики - она ​​должна быть в отдельном классе доступа к данным.(Например, в будущем вам нужно хранить их в автономном режиме в формате XML или использовать Oracle, а не SQL Server ... вы не хотите переписывать свою бизнес-логику!)

Ваши бизнес-объекты должныне имеют связи с базой данных, связанной с ними.Соединение должно быть открыто в некотором методе фабричного типа DAL, объект извлекается / строится, затем соединение закрывается и объект возвращается.

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

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

Надеюсь, это поможет!

8 голосов
/ 15 июля 2010

Насколько я понимаю, соединения должны оставаться открытыми столько, сколько нужно. Большую часть времени я видел соединения в операторах Using, похожих на

using (DBConnection db = new DBConnection(connectString))
{
    //do stuff
}
7 голосов
/ 15 июля 2010

Эта ссылка может быть полезна: Рекомендации по использованию ADO.NET

Вот интересный отрывок.

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

Я всегда следовал практике открытия соединений в блоке using, поэтому метод Dispose (и, следовательно, метод Close) всегда вызывается, не беспокоясь об этом. Используя этот подход, я никогда не сталкивался с ситуацией, когда низкая производительность была связана либо с чрезмерным количеством одновременных соединений, либо с чрезмерными операциями настройки или разрыва.

6 голосов
/ 15 июля 2010

В ответ на оба вопроса, если вы используете что-то, имеющее пул соединений, например ADO.NET, вы должны закодировать свои запросы, чтобы соединение оставалось открытым как как можно короче .Т.е. open and subsequently close a new connection for every method that requires it..Когда вы закрываете соединение, оно будет возвращено в пул соединений и повторно использовано в последующем запросе, и, таким образом, вы не понесете снижения производительности, открывая и закрывая группу соединений.Преимущество состоит в том, что вы не рискуете потерять соединения, которые забыли закрыть, и в конечном итоге у вас будет меньше открытых одновременных соединений, чем если вы будете держать соединения открытыми в течение длительных периодов времени.Не имеет значения, является ли приложение формой Windows вместо веб-формы: оставляйте соединения открытыми как можно короче.

...