ASP.NET Website & Entity Framework в отдельном потоке / нескольких потоках - PullRequest
0 голосов
/ 21 декабря 2011

у нас есть веб-сайт asp.net, который использует Entity Framework 4 в качестве ORM Mapper для SQL Server.

Функциональность базы данных находится в проекте, который скомпилирован в DLL, поэтому он не включен напрямуюна веб-сайте.

У нас было несколько проблем с производительностью, поэтому мы ищем «магический переключатель», который сокращает время материализации и другие недостатки.

У меня есть теоретический вопрос:

Можно ли запустить проект Entity Framework (DLL) в другом потоке, чем веб-сайт?Я думаю о разделении работы базы данных из рабочего потока IIS.Или вообще возможно запустить работника базы данных (dll) несколько раз?(Мы не используем кеширование, поскольку оно не встроено, и мы не нашли подходящего решения.)

Заранее спасибо

Редактировать: спасибо за ответы, но я думаю,моя точка зрения была недостаточно ясной.

Я ищу метод для запуска DLL функциональности базы данных (которая используется почти в каждом файле .aspx (.vb)) в отдельном потоке,Я понятия не имею, как запустить dll в другом потоке, потому что он просто импортирован, а не "запущен".

Было бы ли решением запустить новый поток перед созданием контекста и создать контекст в новом потоке ??Контекст сохраняется до тех пор, пока текущий httpcontext в нашем решении.

Ответы [ 6 ]

2 голосов
/ 21 декабря 2011

Потоки почти никогда не являются «магическим переключателем». Приложения обычно должны быть написаны как многопоточные, и попытка заставить однопоточное приложение быть многопоточным - это рецепт катастрофы.

Я даже не уверен, что вы надеетесь получить, будучи многопоточным. Объекты по-прежнему должны быть материализованы в одном потоке, независимо от того, является ли это основным или рабочим потоком, это все равно занимает столько же времени.

1 голос
/ 21 декабря 2011

SQL Profiling - необходимый шаг в процессе использования EF для чего угодно, кроме простых запросов.

0 голосов
/ 23 декабря 2011

Вы можете подумать о замене EF на микро-ORM, такой как Dapper-Dot-Net, что намного быстрее. Вы можете найти много информации о Dapper прямо на этом сайте.

0 голосов
/ 22 декабря 2011

Для вашего теоретического вопроса (ов)

  1. возможно запустить проект структуры сущности (dll) в другом потоке, чем веб-сайт

yes: обработав запросматериализация в другом проекте, как в N-уровневом приложении, и отправка заполненных объектов из проекта B в проект A;подробнее

N-уровневое приложение - http://msdn.microsoft.com/en-us/magazine/ee321569.aspx

Создание N-уровневых приложений с EF4 - http://msdn.microsoft.com/en-us/magazine/ee335715.aspx

2 несколько раз запускает работника базы данных (dll)«да», тот же ответ, что и 1.

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

0 голосов
/ 22 декабря 2011

ASP.NET

Максимизация производительности с помощью Entity Framework в веб-приложении ASP.NET - http://www.asp.net/web-forms/tutorials/continuing-with-ef/maximizing-performance-with-the-entity-framework-in-an-asp-net-web-application

объясняет несколько вариантов и способов анализа сгенерированных запросов

FAQ по Entity Framework - http://www.ef -faq.org / objectcontext.html см. 3.2.Какова рекомендация для запуска многопоточного приложения в Entity Framework?Является ли Entity Framework поточно-ориентированным?:

Платформа Entity Framework, как и большая часть остальной части .NET Framework, в целом НЕ является поточно-ориентированной.Поэтому, если вы хотите взаимодействовать с Entity Framework или вашими классами сущностей из нескольких потоков, вы должны внимательно следить за проблемами параллелизма.Одна простая модель, которая работает в некоторых случаях, заключается в том, что каждый поток поддерживает свой собственный контекст, так что блокировка не требуется.Это, конечно, означает, что взаимодействия между потоками должны быть весьма ограниченными (например, вы не можете передавать сущность из одного потока в другой, не проявляя особой осторожности), но вы можете делать некоторые полезные вещи, несмотря на эти ограничения.Например, вы можете извлечь данные в одном потоке с помощью MergeOption.NoTracking, а затем разделить данные на группы и передать их другим потокам, которые присоединяют сущности к их собственному контексту потока, вносят обновления и затем сохраняют.

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

0 голосов
/ 21 декабря 2011

(ограничение количества ссылок для новых пользователей - следовательно, многочастный ответ)

Производительность (в целом)

некоторые рекомендации

  1. Производительность MSDNСоображения
  2. P & P Глава 6 - Повышение производительности ASP.NET

1 - который в свою очередь ссылается на «Изучение производительности ADO.NET»Entity Framework », который объясняет несколько параметров, таких как скомпилированные запросы, отложенная загрузка, отсутствие отслеживания и т. Д.

2 - Общие подходы, такие как множество встроенных опций кэширования (возможно? Это в некоторой степени достаточно элегантно) и способы работыс темами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...