Помните, что все это в контексте экосистемы .Net.
Разработчики иногда хотят «оптимизировать» свой код, чтобы повторно использовать свои объекты подключения. Учитывая контекст этого вопроса, это почти всегда ошибка.
ADO.Net имеет функцию, которая называется Пул подключений . Когда вы создаете и открываете новый объект соединения, вы действительно запрашиваете соединение из пула. Когда вы закрываете соединение, вы возвращаете его в пул.
Важно понимать объекты, которые мы используем непосредственно в коде: SqlConnection, MySqlConnection, OleDbConnectio и т. Д. - это всего лишь обертки вокруг реального базового соединения, управляемого ADO.Net, а реальные соединения ADO.Net намного «тяжелее» и дороже. с точки зрения производительности. Именно эти базовые объекты имеют такие проблемы, как аутентификация, сетевой транзит, шифрование, и эти вещи намного перевешивают небольшой объем памяти в объекте, который вы фактически видите в своем собственном коде.
Когда вы пытаетесь повторно использовать объект соединения, вы лишаете ADO.Net возможности эффективно управлять важными связями. Вы получаете эффективность в маленькой вещи за счет гораздо большей вещи.
Повторное использование соединения через приложение или запрос http также может вынудить вас случайно сериализовать что-то, что в противном случае могло бы работать параллельно, и стало бы узким местом в производительности. Я видел это в реальных приложениях.
В случае примера с веб-страницей, где вы, по крайней мере, сохраняете небольшое соединение только на время одного http-запроса / ответа, вы можете получить еще большую эффективность, оценивая, какие запросы выполняются в вашем конвейере запросов, и пытаясь получить они сводятся к как можно меньшему количеству отдельных запросов к базе данных (подсказка: вы можете отправить более одного запроса в одной строке SQL и использовать DataReader.NextResult()
или проверять разные таблицы DataSet
для перемещения между ними).
Другими словами, вместо того, чтобы думать с точки зрения повторного использования одного соединения для приложения или запроса HTTP по сравнению с одним соединением на запрос, думайте с точки зрения одного соединения для каждого вызова в базу данных ... каждый цикл туда и обратно. Затем попытайтесь свести к минимуму количество подключений путем минимизации количества этих поездок. Таким образом, вы можете удовлетворить обе цели.
Но это только один вид оптимизации. Есть также оптимизация времени программиста и получение эффективного повторного использования кода. Разработчики не хотят снова и снова писать один и тот же шаблонный код, чтобы получить открытый и готовый к использованию объект подключения. Это не только утомительно, но и позволяет вносить ошибки в программу.
Но даже здесь, как правило, лучше иметь одно соединение на запрос (или в оба конца). Есть и другие шаблоны, которые вы можете использовать, чтобы избежать переписывания того же стандартного кода. Вот один пример, который мне нравится, но есть много других.