Как обрабатывать большое количество файлов сопоставления в NHibernate - PullRequest
2 голосов
/ 11 сентября 2010

Мы работаем над большим Windows-приложением .NET с очень большой базой данных.В настоящее время мы достигаем 400 таблиц и бизнес-объектов, но это, может быть, 1/4 от всего приложения.

Теперь у меня вопрос: как обрабатывать такое большое количество файлов сопоставления с помощью NHibernate с учетом производительности и использования памяти??Бизнес-объекты и их файлы сопоставления уже разделены в разных сборках.Но я считаю, что NH SessionFactory со всеми сборками будет использовать много памяти, и производительность пострадает.Но если я строю разные фабрики только с подмножеством сборок (возможно, что-то вроде контекста домена, который разделяет сборки по логическим частям), я не могу легко обмениваться объектами между ними, и у меня есть доступ только к подмножеству объектов.

Наш текущий подход заключается в разделении бизнес-объектов с помощью атрибута context.Бизнес-объект может быть частью нескольких контекстов.Когда создается SessionFactory, все файлы отображения данного контекста (один или несколько) объединяются в один большой файл отображения и компилируются в DLL во время выполнения.Затем Session сам создается с помощью этой новой DLL-карты отображения.

Но у этого подхода есть некоторые серьезные недостатки:

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

Может быть, существует совершенно другой подход?Я буду рад любому новому, хотя об этом.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2010

Поскольку SessionFactory должен быть одноэлементным в вашем приложении, стоимость памяти не должна быть столь важной в приложении.

Теперь, если SessionFactory , а не синглтон, есть ваша проблема.

0 голосов
/ 11 сентября 2010

Первое, что вам нужно знать, это то, что вам не нужно сопоставлять все .У меня есть похожий случай на работе, когда я сопоставил основное подмножество объектов / таблиц, с которыми я должен был работать, и другие, с которыми я использовал их с помощью специального сопоставления или с помощью простых запросов SQL через NHibernate (session.createSqlQuery).Те, которые я сопоставил, некоторые из них я использовал Automapper, а для более надоедливых - регулярное отображение Fluent (черт, у меня даже есть вызовы NHibernate, которые охватывают разные базы данных, такие как человеческие ресурсы, финансы и т.1006 * Что касается производительности, я использую только одну фабрику сессий, и лично я не видел никаких недостатков при использовании этого подхода.Конечно, Application_Start требует больше, чем ваше обычное приложение ADO.NET, но после этого он плавно перемещается.Было бы еще медленнее начинать открывать и закрывать фабрику сессий по требованию, поскольку им требуется некоторое время, чтобы освежиться.

...