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