nHibernate мучительно медленно - PullRequest
1 голос
/ 03 декабря 2011

Мы пытаемся использовать nHibernate впервые в моем проекте в VS2010 и Oracle.

Производительность приложения является ключевым критерием для принятия этого проекта. Должны ли мы использовать nHibernate в этом проекте?

Мы проходим через POC. у нас есть таблица с 250 столбцами, и при попытке вставить 500 записей приложение отключается.

Кто-нибудь может предложить сравнение производительности nHibernate и CR / PL / SQL CRUD.

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

Мы используем следующую конфигурацию

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="DefaultSessionFactory">
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
    <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
    <property name="??;</property>
    <property name="show_sql">true</property>
    <property name="use_proxy_validator">false</property>

  </session-factory>
</hibernate-configuration>

Спасибо в ожидании.

Ответы [ 3 ]

1 голос
/ 03 декабря 2011

предложения о show_sql и ведении журналов оказывают влияние, но даже если они включены, у вас не должно возникнуть проблем с тем, что приложение встало на колени только из-за nhibernate.Конечно, существует некоторое снижение производительности при использовании orm взамен всего того, что он обеспечивает с точки зрения удобства сопровождения и возможности быстрого создания приложения, но в большинстве случаев этого недостаточно, чтобы иметь значение.

, если выЕсли у вас проблемы с производительностью, то это серьезная проблема. Я бы предположил, что в вашем приложении есть что-то вызывающее.это не просто nhibernate и использование чего-то другого сделало бы это лучше (если вы не делаете что-то другое с этим чем-то другим).первое, что приходит на ум, это то, что вы должны знать, какой уровень изоляции используют транзакции в вашей системе.в зависимости от того, как вы управляете сеансами и транзакциями, вы можете использовать более высокий уровень изоляции, чем вам нужно, и излишне блокировать объекты базы данных.это может привести к тому, что вы описываете, а также к тупикам.уровень изоляции по умолчанию для system.tranactions является сериализуемым, что требует большой блокировки и, вероятно, не того, что вам нужно.вы можете установить значение по умолчанию для сгенерированных транзакций nhibernate с помощью:

<add key="hibernate.connection.isolation" value="ReadCommitted" />

. Если вы используете system.transactions (Transactionscope), вы можете указать уровень изоляции в конструкторе.Если вы используете wcf, есть атрибуты, конфигурация и другие способы управления этим.не зная больше о вашем приложении, трудно сказать намного больше, и это на самом деле просто предположение, является ли это вашей проблемой или нет.

1 голос
/ 03 декабря 2011

Предложение Иридиум отключить show_sql является хорошим.Если вы используете log4net, вы должны убедиться, что вы установили уровень ведения журнала для NHibernate.Если для вас установлен уровень приложения DEBUG, NHibernate будет регистрировать большое количество записей.

<logger name="NHibernate">
  <level value="ERROR" />
</logger>
0 голосов
/ 05 декабря 2011

Я знаю, что вы уже приняли ответ, но все равно хотели добавить мой 2с.

Прежде всего, вы в одном из ваших комментариев:

Заявка будетиметь более 300 столбцов

Вот и все.Если то, что вы делаете, это отчеты, не используйте ORM, если это не отчеты, то я бы сказал, что ваша база данных очень плохо спроектирована, нет причин иметь 300 столбцов.Я не знаю Oracle, но в SQL Server вы бы понесли производительность из столбцов, находящихся на отдельных страницах, в строку, если длина строки превышает 8 000.

Сгенерированные запросы будут массовыми.Вам лучше использовать хранимые процедуры и не использовать ORM.

, но я пытался использовать сущность из 4 столбцов, и для вставки 100 строк потребовалось 30 секунд, а для той же вставки потребовалось 2-3секунд с обычными запросами вставки pl / sql

Существует множество причин, по которым это может произойти.Если вы генерируете идентификацию в базе данных, тогда NHibernate должен добавить другой выбор, чтобы получить Id для применения к только что вставленной модели.

Разрешение NHibernate генерировать идентификацию может ускорить процесс, либочерез HiLo или Guid / GuidComb.

Открытие нового сеанса для каждой вставки также может быть дорогостоящим при добавлении, повторное использование одного и того же сеанса для вставок и пакетирование вставок вместе вместо отправки отдельных операторов,(опять же, я не знаю, поддерживает ли Oracle пакетирование, например, SQL Server)

В любом случае, вы не предоставили код для показа своего теста, чтобы кто-нибудь мог показать, почему он был медленным для вас.NH хорошо работает для 99% потребностей людей.

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