Преимущества и недостатки NHibernate

Стек:

  • Сохраненный в оперативной памяти точно так же, как "куча".
  • Переменные, созданные на стеке, выйдут из объема и автоматически освобождены.
  • Намного быстрее для выделения по сравнению с переменными на "куче".
  • Реализованный с фактической структурой данных стека.
  • Хранит локальные данные, обратные адреса, используемые для передачи параметров.
  • Может иметь переполнение стека, когда слишком много стека используется (главным образом от бесконечной или слишком глубокой рекурсии, очень больших выделений).
  • Данные, созданные на стеке, могут использоваться без указателей.
  • Вы использовали бы стек, если Вы знаете точно, сколько данных необходимо выделить, прежде чем время компиляции и это не являются слишком большими.
  • Обычно имеет максимальный размер, уже определил, когда Ваша программа запускается.

"куча":

  • Сохраненный в оперативной памяти точно так же, как стек.
  • В C++, переменные на "куче" должны быть уничтожены вручную и никогда не падать из объема. Данные освобождены с delete, delete[], или free.
  • Медленнее для выделения по сравнению с переменными на стеке.
  • Используемый по требованию для выделения блока данных для использования программой.
  • Может иметь фрагментацию, когда существует много выделений и освобождения.
  • В C++ или C, на данные, созданные на "куче", укажут указатели и выделят с new или malloc соответственно.
  • Может иметь отказы выделения, если слишком большой буфера, требуется быть выделенным.
  • Вы использовали бы "кучу", если Вы не знаете точно, в каком количестве данных Вы будете нуждаться во время выполнения или если необходимо выделить много данных.
  • Ответственный за утечки памяти.

Пример:

int foo()
{
  char *pBuffer; //<--nothing allocated yet (excluding the pointer itself, which is allocated here on the stack).
  bool b = true; // Allocated on the stack.
  if(b)
  {
    //Create 500 bytes on the stack
    char buffer[500];

    //Create 500 bytes on the heap
    pBuffer = new char[500];

   }//<-- buffer is deallocated here, pBuffer is not
}//<--- oops there's a memory leak, I should have called delete[] pBuffer;
11
задан Eros 14 August 2009 в 14:13
поделиться

6 ответов

Поскольку другие пользователи перечислили преимущества, я просто перечислю недостатки


Недостатки

  1. Увеличенное время запуска из-за подготовки метаданных (не подходит для настольных приложений)
  2. Огромная кривая обучения без фона orm.
  3. Сравнительно сложно точно настроить сгенерированный sql.
  4. Трудно получить правильное управление сеансом при использовании в нестандартных средах (читайте без веб-приложений)
  5. Не подходит для приложений без чистой объектной модели предметной области ( не всем приложениям в мире не нужны чистые объектные модели домена).
  6. Придется прыгать через обручи, если у вас плохо спроектированная (устаревшая) схема базы данных.
12
ответ дан 3 December 2019 в 05:35
поделиться

Преимущества : ​​

  • Открытый исходный код
  • На основе широко утвержденных шаблонов
  • NH не является генератором кода :)

Недостатки :

  • Поддержка LINQ наполовину
  • Низкая производительность

(см., Например, тесты производительности и LINQ на ormbattle.net )

3
ответ дан 3 December 2019 в 05:35
поделиться

Преимущества:

  1. Кэширование
  2. Простота в коде
  3. Мощность
  4. Гибкость
  5. Поддержка нескольких баз данных

Недостатки:

  1. Больше не нужно напишите свой собственный код сохраняемости
  2. Может снизить ваши знания о SQL

Приложениях, в которых вы должны его использовать:

  • Любые, использующие базу данных

Еще несколько конкретных причин, по которым нравится NHibernate

1
ответ дан 3 December 2019 в 05:35
поделиться

Недостатки: NHibernate не является продуктом Microsoft и поэтому столкнется с некоторым сопротивлением со стороны коллег, которые о нем не слышали. Особенно фанатики СОПО. Настройка файлов сопоставления и отложенной / нетерпеливой загрузки может занять много времени. Если ваша база данных имеет странное соглашение об именах, нетипичный дизайн или очень строгие требования к производительности, может потребоваться больше работы, чем ожидалось.

Я много говорю об этом, но ActiveRecord - отличный слой по сравнению с NHibernate. Он использует атрибуты для сопоставления точек данных с членами класса прямо в самих классах. Люди недостаточно используют эту штуку.

0
ответ дан 3 December 2019 в 05:35
поделиться

Ответ высокого уровня состоит в том, что NHibernate находится в отдельном классе и почти не имеет конкуренции.

Если вам нужен CRUD для базы данных из приложения .NET, вы должны использовать NHibernate, по крайней мере, по двум причинам:

1) Вы получаете поддержку Linq (что требует чего-то вроде ORM)

2) NHibernate очень зрелый

Существенных недостатков нет. Есть и другие варианты, но у этих вариантов есть существенные недостатки.

Я писал об этом некоторое время назад:

.NET и ORM - Решения, решения

0
ответ дан 3 December 2019 в 05:35
поделиться

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

Если у вас есть пользователи, которым вы хотите ограничить записи, которые они могут когда-либо видеть, вы можете использовать представление , предоставьте им доступ только к представлению, а не к базовым таблицам, а затем запросите представление

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

] Представления также очень полезны при рефакторинге баз данных. Часто вы можете скрыть изменение, чтобы старый код не увидел его, создав представление.

  • Будущий запрос ( статья ).
  • Классы моделей - это POCO - что по сути означает, что вы можете легко реализовать антипаттер анемичной области.
  • Перехватчики - вы можете выполнять своего рода аспектно-ориентированное программирование .. .Подобно очень простой реализации прослушивания, регистрации, авторизации, проверки и т. Д. Для вашего домена.
  • Lucene.NET и NHibernate хорошо интегрированы друг с другом, что дает вам очень быструю и эффективную реализацию полнотекстового индексирования.
  • Он очень зрелый и популярный в корпоративной среде.
  • Большое сообщество.
  • Недостатки:

    1. Уже упоминалась кривая обучения. Вы можете начать использовать NHibernate очень быстро, но вам потребуются месяцы, чтобы освоить его. Я очень рекомендую прочитать книгу Manning NHibernate.

    2. Написание отображения XML может быть очень утомительным, особенно для больших баз данных с сотнями и тысячами таблиц, представлений и хранимых процедур. Да, есть инструменты, которые помогут вам сгенерировать эти сопоставления, но вам все равно придется проделать довольно много ручной работы. Fluent NHibernate , похоже, упрощает этот процесс, избавляясь от сопоставлений XML, как и Castle ActiveRecord (AR, хотя его нельзя использовать для анемичной области, поскольку вы определяете сопоставления в атрибутах в классах модели ).

    3. В некоторых сценариях производительность может быть низкой. Например, крупные оптовые операции. Для тех, кому, возможно, придется использовать IStatelessSession, но это неудобно, по крайней мере, чтобы сказать ...

    5
    ответ дан 3 December 2019 в 05:35
    поделиться
    Другие вопросы по тегам:

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