Может ли шкала персистентного невежества? - PullRequest
9 голосов
/ 13 февраля 2009

Я кратко рассмотрел NHibernate и Linq2Sql. Я также собираюсь взглянуть на Entity Framework.

Когда я говорю об этих ORM, возникает вопрос: «Они не могут масштабироваться», так могут ли они? Из Google складывается впечатление, что они способны хорошо масштабироваться, но в конечном итоге я полагаю, что должна быть цена, которую стоит заплатить. Стоит ли платить за более богатый и простой бизнес-уровень.

Ответы [ 3 ]

5 голосов
/ 13 февраля 2009

Это хороший вопрос, и ИМХО они могут масштабироваться так же, как и любой пользовательский DAL. Я использовал только nHibernate, поэтому я сосредоточусь только на нем и его возможностях, которые могут помочь масштабировать систему.

  • Ленивая загрузка - поскольку он поддерживает отложенную загрузку, вы можете избежать загрузки любых ненужных предметов. Конечно, вам нужно остерегаться проблемы Select n + 1, однако в системе есть что-то, чтобы это предотвратить.
  • Стремительное извлечение. Существуют различные способы оперативного извлечения объектов, которые могут вам понадобиться, что позволяет избежать дополнительных поездок в SQL.
  • Кэш второго уровня - nHibernate поддерживает кэш второго уровня, который можно использовать для повышения масштабируемости за счет сокращения обращений к БД. Существуют различные поставщики поддержки, которые дают вам некоторую гибкость.
  • Напишите свой собственный SQL - В nHibernate вы можете вызывать хранимые процедуры или предоставлять встроенный SQL-запрос, который будет возвращать ваши сущности. Это позволит вам использовать свой собственный SQL, когда сгенерированный sql его не обрезает. Например, стремясь загрузить самосоединяющееся дерево с помощью рекурсивного запроса.

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

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

2 голосов
/ 13 февраля 2009

Осколки гибернации переносится в порт NHibernate , что позволяет выполнять горизонтальное масштабирование.

Есть также несколько очень крутых хаков, таких как этот для реализации шардинга.

Так что ответ да, NHibernate может масштабироваться невежественным и полностью прозрачным способом.

1 голос
/ 16 февраля 2009

Просто неправильно говорить, что приложения, созданные в ORM, плохо масштабируются. Конечно, это произошло до того, как неосторожные или ленивые разработчики злоупотребили ORM, написав код, который генерирует ужасно неэффективный SQL. Создание эффективных приложений означает понимание того, что на самом деле делают все прекрасные абстракции . Однако, чтобы избежать этой ловушки, не нужно много. Использование ORM не означает никогда не открывать профилировщик SQL или NHibernate Profiler .

А что касается утверждения, что SP просто намного быстрее, прочитайте это и это . И, кроме того, ORM (по крайней мере, NHibernate) дают вам довольно простые способы использования SP, если вам когда-либо понадобится.

...