Entity Framework - Можно ли обмениваться данными DbCompiledModel и метаданными, хранящимися в памяти, между разными доменами приложений? - PullRequest
0 голосов
/ 26 июня 2019

У нас есть большое приложение на основе ERP, которое использует несколько технологий .net в нескольких различных проектах. Структура решения похожа на:

Библиотеки классов:

  • Core (инфраструктура, расширения, утилиты и т. Д.)
  • Бизнес (тесно связанный POCO с сопоставлениями в Gentle.Net) - унаследованный уровень, который будет преобразован в веб-службы.
  • Домен (объекты poco, отраженные из базы данных, созданной для EF)
  • Данные (EF dbcontext, сопоставление конфигурации с объектами домена)
    • InstanceContext = db context для всех таблиц (~ 400 сопоставленных таблиц)
    • ReadOnlyContext = db context для всех представлений базы данных (~ 500 сопоставленных представлений)

Веб-сервисы:

  • Веб-сервисы (устаревшие сервисы asmx)
  • API (веб-API)

Передние торцы:

  • Приложение WebForms (90% интерфейса)
  • Приложение WebForms зависло на .net 3.5 в устаревшем режиме cas, чтобы обеспечить приличную производительность экспорта локальных отчетов rdlc.
  • Приложение MVC (более новая версия интерфейса)
  • Различные приложения WinForms для интеллектуальных клиентов, настроенные для нужд клиентов

Мы постепенно реорганизуем приложение, чтобы, надеюсь, отделить некоторые подпрограммы бизнес-логики. Мы начали с замены Gentle.Net ORM (очень старой ORM, которая хорошо с нами обращалась на протяжении многих лет) на Entity Framework. Однако мы столкнулись с проблемой использования памяти (не утечки памяти).

Сначала это казалось очень безболезненным, поскольку мы запустили генератор обратного POCO EF для существующей базы данных и внедрили функцию DbConfiguration для создания файла EDMX (для более быстрого запуска).

Теперь, когда большинство проектов внешнего интерфейса и веб-сервисов используют EF, требования к памяти стремительно растут. Каждому домену приложения требуется ~ 500 МБ памяти для хранения контекстов БД, это происходит во время инициализации EF. Мы провели обширное профилирование памяти и можем подтвердить, что использование нашего контекста правильно утилизируется. Похоже, что DbCompiledModels остаются в памяти навсегда, так как EF требует, чтобы кэшированные данные работали.

I может объединить проекты MVC / Webforms, ASMX / WebAPI вместе, чтобы уменьшить объем требуемой памяти, поскольку это приведет к удалению 2 доменов приложений. Но мне интересно, есть ли способ, которым я мог бы поделиться кэшированными моделями сущностей \ отображением информации между различными доменами приложений. Как распределенный кеш, но для DbCompiledModels?

Каждый проект запускается как приложение на одном веб-сайте в IIS, и они всегда будут использовать один и тот же контекст базы данных \ mappings, поэтому их необязательно создавать экземплярами для каждого домена приложений.

* примечание - хотя существуют более эффективные способы рефакторинга этой проблемы, они требуют значительного времени для рефакторинга и тестирования из-за размера приложения. Исправление низко висящих фруктов даст нам немного передышки. Если при запуске каждое приложение может совместно использовать инфраструктуру сущностей информации отображения в памяти, это сократит использование памяти на 50%.

1 Ответ

0 голосов
/ 26 июня 2019

Каждый AppDomain требует ~ 500 МБ памяти для хранения контекстов БД, это происходит во время инициализации EF.

Я бы предположил, что, возможно, вы слишком долго держитесь за свой DbContext? Или ваша структура базы данных огромна. Можно использовать и утилизировать DbContext так часто, как вам хочется, поэтому делайте вызовы методов как можно меньше - и не забывайте регистрировать DbContexts как область видимости, чтобы они надлежащим образом удалялись из

...