2009-03-04 3 views
3

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

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

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

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

Я пробовал искать везде здесь и в Интернете, чтобы найти лучшие практики, но не повезло. Ближе всего я получил это: is it safe to keep database connections open for long time, но это кажется более подходящим для распределенных систем, в которых у вас более одного пользователя базы данных, тогда как я получил только свой веб-сервер.

ответ

8

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

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

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

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

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

1

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

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

0

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

0

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

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

+0

Это звучит так, будто он должен делать это самостоятельно. Но пусть ADO.Net сделает свою работу лучше. – BendEg

0

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

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

-2

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

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

+0

Объединение пулов делает намного лучшую работу. Если у вас будет постоянное соединение, это будет: за клиента? По теме? За приложение? «Мое первое приложение asp.net» открыло одно соединение и передало его. Переключение на «Открыть», «делать», закрыто, привело к экономии времени на время приложения. –

+0

И что я сказал, что не согласен с этим? –

+0

«да, разумнее иметь открытое соединение, которое вы поддерживаете на некоторое время, чем время от времени открывать соединение с базой данных каждый раз» - я не сделал нисходящий опрос, но это не лучшие практики для ADO.NET, что о чем идет речь. – Will

1

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

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

+0

Кэширование будет моей следующей заботой. Заходите на SO через несколько недель xD – cwap

+0

Я забыл указать, что кэширование - лучшая альтернатива возиться с объектом соединения. +1. – Will

 Смежные вопросы

  • Нет связанных вопросов^_^