Подтвердить что ты не робот

Является ли ORM (Linq, Hibernate...) действительно полезным?

Я играл с некоторыми LINQ ORM (LINQ непосредственно на SQL), и я должен признать, что мне нравятся его выразительные способности. Для небольших приложений, подобных утилитам, он также работает довольно быстро: выпадающий SQL-сервер на какой-то поверхности, и вы настроены на linq.

Однако для крупных приложений DAL никогда не было проблемой для меня, чтобы настроить и не поддерживать, и чаще всего, как только он был установлен, все программирование там все равно не происходило...

Мой, честный - я новичок в ORM - вопрос: какое большое преимущество ORM над написанием достойного DAL вручную?

(кажется двойным, его не удалось найти)

ОБНОВЛЕНИЕ: ОК его двойник:-) Я сам нашел его:

ORM против уровня доступа к данным Handcoded

4b9b3361

Ответ 1

Я использовал JPA в проекте, и сначала я был очень впечатлен. Простите, я все это время спасал в написании SQL! Постепенно, однако, я немного разочаровался.

  • Сложность определения таблиц без суррогатных ключей. Иногда нам нужны таблицы, в которых нет суррогатных ключей. Иногда нам нужен многоколоночный первичный ключ. У TopLink были трудности с этим.
  • Принудительные отношения структуры данных. JPA использует аннотации для описания взаимосвязи между полем и контейнером или ссылочным классом. Хотя это может показаться превосходным на первом сайте, что вы будете делать, когда вы ссылаетесь на объекты по-разному в приложении? Скажем, например, вам нужны только конкретные объекты, которые ссылаются на конкретные записи на основе некоторых конкретных критериев (и он должен быть высокопроизводительным без ненужного распределения объектов или поиска записей). Усилия по модификации классов Entity почти всегда превышают усилия, которые существовали бы, если бы вы никогда не использовали JPA в первую очередь (предполагая, что вы вообще добиваетесь того, чтобы JPA выполняла то, что вы хотите).
  • Caching. JPA определяет понятие кешей для ваших объектов. Следует помнить, что база данных имеет свой собственный кеш, обычно оптимизированный вокруг минимизации чтения дисков. Теперь вы дважды кэшируете свои данные (игнорируя несохраненную кучу GC). Как это может быть преимуществом, вышло за меня.
  • Данные!= Объекты. Для высокопроизводительных приложений извлечение данных из БД должно выполняться очень эффективно. Форсирование создания объектов не всегда хорошо. Например, иногда вам могут понадобиться массивы примитивов. Это около 30 минут работы для опытного программиста, работающего с прямым JDBC.
  • Производительность, отладка. Гораздо сложнее оценить производительность приложения со сложными вещами, происходящими в (под-оптимальной, автогенерированной) кеширующей подсистеме, еще больше напрягая ресурсы проекта и бюджеты.

Большинство разработчиков не понимают проблему несоответствия импеданса, которая всегда существовала при сопоставлении объектов с таблицами. Этот факт гарантирует, что JPA и друзья, вероятно, получат значительный (кашлевой) успех в обозримом будущем.

Ответ 2

  • Strong-типирование
  • Не нужно писать DAL самостоятельно = > экономия времени
  • Не нужно писать код SQL самостоятельно = > менее подвержен ошибкам

Ответ 3

Я использовал Hibernate в прошлом, чтобы динамически создавать довольно сложные запросы. Логика, связанная с созданием соответствующего SQL, была бы очень трудоемкой для реализации, по сравнению с логикой для построения соответствующего Criteria. Кроме того, Hibernate знал, как работать с различными базами данных, поэтому мне не нужно было вставлять какую-либо логику в наш код. Разумеется, нам приходилось тестировать разные базы данных, и мне нужно было написать расширение для правильной обработки запросов "как", но затем он работал без SQL Server, Oracle и HSqldb (для тестирования) без проблем.

Там также тот факт, что у него больше кода, который вам не нужно писать, что всегда приятно:) Я не могу сказать, что я использовал LINQ to SQL в чем-то большом, но где я его использовал для "быстрого и грязного" веб-сайта (очень маленького, редко обновляемого, мало пользы от абстракции полного слоя) было прекрасно.

Ответ 4

Что ж, для меня многое связано с тем, что вам не нужно повторно изобретать/воссоздавать колесо каждый раз, когда мне нужно внедрить новую модель домена. Это намного эффективнее использовать, например, nHibernate (мой ORM выбор) для создания, использования и поддержки уровня доступа к данным.

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

В настоящее время я начинаю с домена. Я моделирую его в UML, и большую часть времени я могу генерировать все из этой модели, включая схему базы данных. Нужно несколько настроек здесь и там, но с моей текущей настройкой я получаю 95% работы с доступом к данным, сделанным в кратчайшие сроки. Время, которое я сохраняю, я могу использовать для точной настройки частей, которые нуждаются в настройке. Мне редко приходится писать любые SQL-запросы.

Это мои два цента.: -)

Ответ 5

Переносимость между различными поставщиками db.

Ответ 6

Мой, честный - я новичок в ORM - вопрос: что такое большой прогресс ORM над написанием достойного DAL вручную?

Не все программисты готовы или даже способны написать "достойный DAL". Те, кто не может испугаться или просто испугаться, просто считают LINQ или любой другой ORM благословением.

Я лично использую LINQ для управления коллекциями в коде из-за его выразительности. Он предлагает очень компактный и прозрачный способ выполнения некоторых общих задач в коллекциях непосредственно в коде.

LINQ перестанет быть полезной для вас, когда вы захотите создать очень конкретные и оптимизированные запросы вручную. Тогда вы, вероятно, получите смесь запросов LINQ, смешанных с пользовательскими хранимыми процедурами, подключенными к ней. Из-за этих соображений я решил отказаться от LINQ to SQL в моем текущем проекте (так как у меня есть достойный (imho) слой DAL). Но я уверен, что LINW будет отлично справляться с такими простыми сайтами, как, например, ваш блог (или, если на то пошло).

В LINQ/ORM также может быть учтено отставание для сайтов с высоким трафиком (так как каждый входящий запрос должен быть скомпилирован снова). Хотя я должен признать, что я не вижу никаких проблем с производительностью в SO.

Вы также можете рассмотреть возможность ожидания Entity Framework v2. Он должен быть более мощным, чем LINQ (и, надеюсь, не так уж плохо, как v1 (по мнению некоторых людей)).

Ответ 7

Прозрачная настойчивость - изменения сохраняются (и каскадируются) без необходимости называть Save(). На первый взгляд это кажется кошмаром, но как только вы привыкнете к работе с ним, а не против него, ваш код домена может быть полностью освобожден от проблем с сохранением. Я не знаю ни одного ORM, кроме Hibernate/NHibernate, который делает это, хотя могут быть некоторые...

Ответ 8

Лучший способ ответить на вопрос - понять, какие именно библиотеки, такие как Hibernate, фактически выполняют от вашего имени. По большей части абстракции существуют по какой-то причине, часто для того, чтобы сделать некоторые проблемы менее сложными, или в случае, когда Hibernate является почти DSL для выражения некоторых концепций устойчивости простым образом.

  • Можно легко изменить стратегию выборки для коллекций, изменив аннотацию, а не записывая много кода.

  • Hibernate и Linq проверены и проверены многими, мало шансов, что вы сможете достичь этого качества без большой работы.

  • Hibernate адресует многие функции, которые потребуют от вас месяцев и лет для кода.

Ответ 9

Кроме того, хотя в документации JPA указано, что составные клавиши поддерживаются, они могут быстро стать очень (очень) сложными. Вы можете легко потратить часы (дни?), Пытаясь получить что-то очень простое. Если JPA действительно упростит ситуацию, разработчики должны быть освобождены от слишком многого размышления об этих деталях. Это не так, и нам остается понять два уровня абстракции: ORM (JPA) и JDBC. Для моего текущего проекта я использую очень простую реализацию, которая использует защищенный пакетом static get "конструктор", который принимает ResultSet и возвращает объект. Это примерно 4 строки кода для каждого класса, плюс одна строка кода для каждого поля. Это простой, высокопроизводительный и довольно эффективный, и я сохраняю полный контроль. Если мне нужно обращаться к объектам по-разному, я могу добавить еще один метод, который читает разные поля (например, оставив остальные нули). Мне не нужна спецификация, которая сообщает мне, "как должны выполняться ORM (!)". Если мне требуется кэширование для этого класса, я могу реализовать его точно по мере необходимости.

Ответ 10

Я использовал Linq, я нашел его очень полезным. Я сохраняю много времени, записывая код доступа к данным. Но для больших приложений вам нужно больше DAL, для них вы можете легко создавать классы, созданные им. Поверьте, это действительно улучшает вашу производительность.