2009-11-10 4 views
1

У меня возникла проблема с тем, что я реализовал WCF-сервис, который использует объекты LINQ ... Для генерации содержимого ответа на вызов службы требуется большое количество LINQ/SQL выбирает ...Использование «кэшированных» объектов LINQ

Независимо от того, что служба не делает никаких обновлений или вставок в БД, поэтому я хотел бы реализовать своего рода «кеширование» объектов LINQ (также содержимое базы данных не растет миллионы ... в действительности это будет ограничено примерно 63 тысячами основных (с подзапросами), такими как User -> Orders)

Также ответ службы не должен содержать 100% данных up2date, поэтому обновления данных на заднем плане не должно быть ничего, чтобы думать об этом

Итак, в настоящее время мой план выглядит следующим образом:

  • захватить все соответствующие таблицы из базы данных с помощью LINQ, так что есть все объекты «кэшированные» (функция ToList() должен сделать это, правильно ?)
  • Заменить объект сущности с помощью своего рода смарт резьбе каждые Рентгеновские минут/часов (как раз захватывая данные из БД, блокировка в настоящее время в кэше Linq-DataContent и заменить его на новый ..)

Итак, как вы думаете ... как вы думаете, я должен/мог сделать это так? Мне действительно нужно увеличить время отклика службы, но оптимизация SQL (например, меньшее количество выборок) на самом деле не вариант для меня, так как все средства LINQ уже реализованы.

Заранее благодарен!

ответ

2

Это звучит как преждевременная оптимизация для меня. Рассмотрю:

  1. Есть много вещей, которые могут замедлить приложение, как это. Запросы БД не могут быть медленной частью. Если медленной частью является компиляция L2E, результаты кэширования - это неправильное решение.
  2. Выполнение неверного ввода кэша обычно сложнее, чем оптимизация запросов. Есть, конечно, исключения.
  3. EF уже кэши объекты экземпляров в контексте. Убедитесь, что вы не изобретаете колесо.

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

+0

Спасибо! .. Ссылаясь на это: http://stackoverflow.com/questions/1707668/get-linq-to-preload-a-complete-table ... Как бы я это понял и использовать этот кеш. – David

+0

Этот вопрос для L2S. Используйте Context.GetObjectByKey, чтобы избежать нового запроса, если объект уже находится в контексте. ** Но, как я уже сказал, это, вероятно, не медленная часть. Будьте осторожны, преждевременно не оптимизируйте. –

1

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

GetRegister(id) 
    if cache has not register with that id 
     retrieve register from database 
     store register in cache 
    return cached register 

Таким образом, ваш кеш реализован, но вы не тратите память без необходимости.

+0

Да, но разве у меня не проблема, что запрос «первый» такой же медленный, как сейчас? – David

+0

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

+0

Поскольку это веб-сервис, он будет работать все время, поэтому я могу отбросить некоторые системные ресурсы .. спасибо! – David

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