2011-02-03 3 views
1

Мой вопрос состоит из нескольких частей и может длиться долго, поэтому извините.Подход - Оптимизация LINQ для производительности

Я использую LINQ для передачи данных через клиента Silverlight.

Часть 1: Пул соединений & Оптимизация: Я хочу знать, как я могу гарантировать, что LINQ устанавливает только одно соединение с базой данных, а также отслеживает объединение пулов. Раньше я использовал свойство объединения пулов в строке SQL Connection. Итак, если я поместил этот файл настроек, где строка соединения задана при добавлении таблиц в DBML-файле, LINQ будет считать, что LINQ (DBML) формирует ядро ​​моего уровня доступа к данным. Я пишу классы, которые имеют методы, которые в основном являются запросами LINQ. Я использую объект DataContext в блоке «using» в своем коде, где я обрабатываю часть, связанную с данными. Является ли это причиной того, что LINQ может использовать несколько соединений? Если у меня есть DataContext как переменная уровня класса, это обеспечит только одно соединение?

Часть 2: Оптимизация Не так далекое прошлое, дни ADO.Net, я использовал для записи хранимых процедур, выполнял их через DataReader, а затем выполнял цикл через DataReader, заполнял столько объектов моего класса Model и передавал эта коллекция для привязки к DataGrid. В дни LINQ я делаю более или менее то же самое, что и создание коллекции объектов. Но я выполняю непосредственно инструкции LINQ. Я могу догадаться, что хранимые процедуры SQL дадут мне более высокую производительность, но если я выполню хранимые процедуры с использованием LINQ, это будет так же быстро, как и предыдущие, и это правильный подход?

+0

Какова фактическая проблема с производительностью? – Phill

+0

Доступ к данным медленный, из-за чего общая производительность медленная. –

+0

, поэтому проблема не в ORM или пуле соединений, а в самой базе данных. – Phill

ответ

7

Ohoh .... так много вредных привычек.

Часть 2: Оптимизация В не столь далеком прошлом , ADO.NET дней, я имел обыкновение писать хранимые процедуры, выполнять его через DataReader, а затем петлю через DataReader, заполнить как можно больше объектов моего Модельный класс и передать его коллекции для привязки к DataGrid. В LINQ дней я делаю более или менее то же самое, что и , создавая множество объектов . Но я выполняю прямое операторов LINQ. Я догадываюсь, что SQL хранимых процедур даст мне более высокую производительность, но

В основном, в прошлом у вас были некоторые незначительные dlusions. Сохраненные процедуры имеют NO (!) Прирост производительности более 10 лет. Это четко указано в документации. Выполнение SQL выполняется так же быстро, как для не хранимых процедур, планы запросов кэшируются и повторно используются для обоих.

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

К сожалению, у многих программистов все еще есть заблуждения, потому что они получают их от других людей, которые их получили .... 10 лет назад, когда хранимые процедуры имели неотъемлемые преимущества. Теперь это время SQL Server 6.5 - с 7.0 это история.

http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx

В основном вы обращались потерянное время разработки и много бесполезного кода против .... mostlikely не измеримого преимущества.

Часть 1: Подключение Объединив & оптимизации: Я хочу знать, как я могу гарантировать, что LINQ устанавливает только один подключения к базе данных, а также следовать пулов соединений.

У вас нет. В принципе, не пытайтесь быть умнее, чем хорошо для вас. Что не так с несколькими соединениями, ЕСЛИ ОНИ СДЕЛАТЬ СМЫСЛ?

Для пула, yu should (sql server) не нужно ничего помещать в строку соединения. И да, LINQ не будет волшебным образом обойти пул соединений, определенный в строке соединения. См., LINQ никогда не разговаривает с базой данных - для этого используется ADO.NET, и ADO.NET не волшебным образом изменил поведение только потому, что ORB более высокого уровня использует его вместо вас. Строка соединения содержит записи объединения, ADO.NET все еще видит их и следует за ними.

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

Я использую объект DataContext в «с помощью» блок в моем коде, где я обрабатывать данные, относящиеся часть. Это причина, почему LINQ может использовать несколько соединений? Если у меня есть DataContext в качестве переменной уровня класса, то обеспечит только одно соединение?

Ah - зависит. Это может иметь смысл, может и нет. Вы знаете, прежде чем думать, что у вас есть проблема, особенно учитывая объем информации, которую вы даете здесь (т. Е. Нет), делайте ТОЛЬКО разумную вещь: возьмите профилировщик и ИЗМЕРИТЕ, есть ли у вас один. Openng/закрытие соединения 100 раз или 1000 раз, скорее всего, даже не появится на профилировщике. Нет проблемы = нет причин что-то исправить.

Сказанное так, что мне не нравится открытие соединения метода. Обычно это показывает плохой дизайн класса. Соединения должны использоваться повторно в пределах единицы работы.

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