Управление временем жизни EntityConnection

Были многие вопрос на управлении временем жизни EntityContext,

например, Инстанцирование контекста в LINQ к Объектам

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

Но при проведении некоторого исследования для ускорения моего доступа к базе данных, я столкнулся с этим сообщением в блоге...

Улучшение производительности платформы объекта

Сообщение утверждает, что низкая производительность EFs по сравнению с другими платформами часто происходит из-за объекта EntityConnection, создаваемого каждый раз, когда новый объект EntityContext необходим.

Для тестирования этого, я вручную создал статический EntityConnection в Global.asax.cs Application_Start ().

Я затем преобразовал все свои операторы использования контекста в

using( MyObjContext currContext = new MyObjeContext(globalStaticEFConnection)
{
   ....
}

Это, кажется, ускорило вещи немного без любых ошибок, насколько далеко, как я могу сказать.

Но действительно ли это безопасно?

Использование applicationwide статического EntityConnection представляют условия состязания?

С наилучшими пожеланиями, Kervin

7
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

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

7
ответ дан 7 December 2019 в 03:13
поделиться
  • Если ваш контекст EF относится к приложению, учтите, что пользователь A внес изменения (не зафиксировал), а пользователь B - зафиксировал свои изменения, все изменения будут зафиксированы в базе данных, так как оба пользователя A и B используют один и тот же экземпляр

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

Один из способов реализовать это - использовать контейнер DI (я использую Unity) для управления временем жизни контекста EF. Менеджер времени жизни для каждого веб-запроса не предоставляется в Unity по умолчанию, но есть масса статей, которые показывают, как это можно сделать.

HTH.

2
ответ дан 7 December 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: