Эффективность NHibernate - PullRequest
       10

Эффективность NHibernate

6 голосов
/ 19 декабря 2008

Отставая в мире ORM и современного доступа к данным, я стремлюсь отойти от DataSets ( shudder ) и перейти к надлежащей структуре сопоставления.

Я только что освоил Linq to SQL, и сейчас я изучаю NHibernate с целью его использования в нашем следующем проекте.

При использовании старой школы sql и наборов данных ваши sql запросы, очевидно, возвращают только те данные, которые вы хотите. Я также понимаю, что L2S также достаточно умен, чтобы оценить предложения where, чтобы он всегда возвращал только те объекты, которые вы запрашивали. NHibernate то же самое? И то же самое с Линк Айенде в NHibernate?

Под этим я подразумеваю, если я делаю эквивалент:

Select * from customers where name = "fred"

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

Если это разумно, каковы предостережения? Существуют ли определенные типы запросов, которые не могут быть оценены таким образом? Какие проблемы с производительностью мне нужно знать?

Спасибо

Andrew

Ответы [ 7 ]

8 голосов
/ 19 декабря 2008

Быстрый ответ заключается в том, что ORM проверит имя свойства и преобразует его в SQL-запрос, который будет вас называть = .... Таким образом, он не загрузит всех клиентов в память для поиска имени .

4 голосов
/ 19 декабря 2008

Nhibernate поставляется с несколькими различными способами запроса базы данных. Hibernate использует Sql-подобный синтаксис HQL, который является SQL для объектов. Кроме того, он может выполнить поиск по примеру, где вы создаете объект и вводите желаемое critea, а затем hibernate извлекает объект из БД с такими же значениями свойств.

посмотрите здесь, вы получите скорость лето Nhibernate урок 2 и 2a ответят более подробно

НТН

кости

3 голосов
/ 19 декабря 2008

Если вы действительно обеспокоены тем, какие запросы генерирует NHibernate, запустите SQL Server Profiler и выясните, что работает, или настройте его ведение журнала и включите вывод SQL. Он отобразит все операторы SQL, для которых вы настраиваете его log4net.

1 голос
/ 22 декабря 2008

Добиться производительности корпоративного класса с помощью NHibernate довольно просто.

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

Select cust.Address, cust.Email from customers cust where cust.Name = "fred"

Также важна глубина вашего запроса. Мы можем ограничить количество возвращаемых записей (важно для больших наборов данных), используя HQL запросов, которые отображают данные в зависимости от вашего поставщика базы данных ... при условии, что они работают с анализатором HQL. Вы также можете установить FetchMode или CollectionFetchMode в ваших сопоставлениях отношений, которые будут выполнять объединения, для выбора из нескольких таблиц за одно взаимодействие.

Если вы используете сервер SQL, вы можете включить sp_execsql , который будет запускать все выборки через сохраненный процесс для быстрого повышения производительности.

Для получения дополнительной информации есть большая статья о Code Project , в которой подробно рассказывается, как повысить производительность NHibernate в вашем приложении. Если вы используете сервис-ориентированную архитектуру, задержка может быть большой проблемой. Проверьте эту тему для некоторых деталей об этом.

1 голос
/ 20 декабря 2008

NHibernate создаст запрос, похожий на ваш пример, используете ли вы HQL или ICriteria, но на самом деле он сделает вас лучше. Он создаст параметризованный SQL-оператор, чтобы запрос мог кэшироваться в SQL Server.

Критерии ICIC чрезвычайно гибки, однако есть некоторая кривая обучения, позволяющая овладеть ими. Я также рекомендую лето скринкастов nhibernate, чтобы быстро набрать скорость.

1 голос
/ 19 декабря 2008

Да, NHibernate должен быть одним из самых производительных ORM, я использовал его в одном проекте, и это было довольно круто. О LINQ to NHibernate вы можете проверить эту статью . Существует кривая обучения (NHQL и ICriteria), и если вы хотите совершить прыжок, сначала будет сложно, но потом все потраченное время вернется к вам. Надеюсь, это поможет.

0 голосов
/ 16 октября 2009

Разработка Linq to SQL была прекращена для Linq to Entities. Вам также следует попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...