Открытие соединения с базой данных один раз или для каждой операции с базой данных?

StackOverflow https://stackoverflow.com/questions/611023

Вопрос

В настоящее время я создаю веб-портал с ASP.NET, который сильно зависит от использования базы данных. По сути, каждый (почти каждый: P) GET-запрос любого пользователя приводит к запросу к базе данных с веб-сервера.

Теперь я действительно новичок в этом, и я очень обеспокоен производительностью. Из-за недостатка опыта в этой области я не знаю, чего ожидать.

Мой вопрос заключается в том, чтобы с помощью ADO.NET было бы разумнее просто оставить статическое соединение открытым от веб-сервера к базе данных, а затем проверять целостность этого соединения на стороне сервера перед каждым запросом к базе данных? - Или мне лучше открывать соединение перед каждым запросом, а затем закрывать его?

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

Я пытался искать повсюду здесь и в Интернете, чтобы найти лучшие практики по этому поводу, но безуспешно. Самое близкое, что я получил, было это: безопасно ли оставляйте соединения с базой данных открытыми в течение длительного времени , но это кажется более подходящим для распределенных систем, где у вас есть несколько пользователей базы данных, тогда как у меня есть только мой веб-сервер ..

Это было полезно?

Решение

Вы рано беспокоитесь о производительности.

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

Что-то вроде ...

public object Load()
{
  using (SqlConnection cn = new SqlConnection(connectionString))
  using (SqlCommand cm = new SqlCommand(commandString, cn))
  {
    cn.Open();
    return cm.ExecuteScalar();
  }
}

Другие советы

Лучше позволить ADO.NET обрабатывать пулы соединений. Он сохранит соединение, если сочтет это необходимым, но не использует статический объект соединения. Это просто пахнет. Было бы лучше передать объект соединения методам, которые в нем нуждаются, и создать соединение в блоке using .

Вы всегда должны закрывать соединение после завершения взаимодействия с БД. ADO.NET имеет пул соединений, который позаботится об эффективном повторном использовании соединений. Всякий раз, когда вы открываете 2-е, 3-е и последующие подключения - они будут взяты из пула почти без затрат.

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

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

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

ADO.NET выполняет пул соединений. Когда вы вызываете close для объекта подключения, он будет сохранять соединение в пуле, делая следующее соединение намного быстрее.

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

Вы определенно не хотите открывать соединение для каждого вызова базы данных, что очень быстро приведет к крайне низкой производительности. Создание подключения к базе данных очень дорого.

Вместо этого вам следует использовать пул соединений. Пул будет управлять вашими соединениями и, по возможности, попытаться повторно использовать существующие соединения.

Я не знаю вашу платформу, но посмотрите на пул соединений - должна быть доступна библиотека или утилита (либо в базовой системе, либо в виде надстройки, либо в комплекте с драйверами базы данных), которая обеспечит средства для объединения нескольких активных соединений с базой данных, которые готовы и используются для получения при получении одного из пула.

Честно говоря, я ожидаю, что объединение в пул происходит по умолчанию в любой библиотеке абстракции базы данных (с доступной опцией для ее отключения). Похоже, что ADO.NET делает это.

Действительно, первый вопрос, который нужно задать, это , почему вы очень беспокоитесь о производительности? Какова ваша ожидаемая нагрузка? Вы уже пробовали это?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top