none
Linq To Sql - оптимизация работы RRS feed

  • Вопрос

  • Для доступа к базе нужен экземпляр DataContext.
    Но как эффективно его использовать? 
    Сделать его глобальным для всего проекта? Тогда для одновременных запросов будут выдаваться ошибки типа: "Specified cast is not valid." или "InvalidCastException" или "DataReader is closed".
    Сделать единственный экземпляр для одной страницы? Тогда тоже могут получаться такие же эксепшены, если со страницы выполнить много запросов.
    Делать каждый новый экземпляр для любого запроса? Тогда это уж совсем долго (как я понимаю: создание объекта + коннект к базе). Но ошибки тогда не появляются.
    Что делать? Подскажите! Может есть другие решения? Хочется чтобы можно было много запросов одновременных отправлять и по скорости было как можно быстрее:)
    5 октября 2011 г. 20:10

Ответы

Все ответы

    • Помечено в качестве ответа bwlog 6 октября 2011 г. 16:04
    5 октября 2011 г. 20:26
  • Создание DataContext - дешевая операция. .NET использует пул соединений при работе с SQL Server - соединения используются повторно, а не открываются каждый раз. DataContext реализует IdentityMap, и отслеживает все выбранные через него объекты. Если держать его живым чуть дольше чем на одну операцию - он очень быстро вытянет в память всю базу данных.

    MSDN по DataContext class:

    В целом, экземпляр DataContext предназначен для одной "единицы работы" вне зависимости от того, как приложение определяет этот термин. DataContext является простым объектом, и его создание не требует больших финансовых затрат. Обычное приложение LINQ to SQL создает экземпляры DataContext в области метода или как элемент кратковременных классов, представляющих логический набор связанных операций базы данных.

     

     

    5 октября 2011 г. 22:31
  • см. Linq to SQL DataContext Lifetime Management (Rick Strahl, Microsoft MVP)
    и LINQ to SQL (серия статей в блоге Scott Guthrie, Corporate Vice President)

    > ... и по скорости было как можно быстрее

    прямые запросы к бд + stored procedures; кэширование Caching data using SqlChangeMonitor 

    5 октября 2011 г. 23:50
  • Уважаемый пользователь, пожалуйста, не забудьте отметить сообщение или сообщения, которые являются решением вашей проблемы, даже если это ваше собстевенное сообщение. Это можно сделать с помощью кнопки 'Пометить как ответ', которая есть под каждым сообщением.

    Спасибо.


    Для связи [mail]
    6 октября 2011 г. 6:06
    Модератор
  • Для веб-приложений контекст обычно существует "Per web request", и именно такое поведение следует реализовывать. Легче всего это решается при использовании DI контейнеров, напр. "Ninject", где можно указать "время жизни" соответствующего экземпляра класса.
    6 октября 2011 г. 6:37