Низкая производительность NHibernate на событиях автоматического сброса? - PullRequest
4 голосов
/ 12 ноября 2009

Позвольте мне начать с того, что я знаю, что NH не рекомендует использовать массовые операции. Но в качестве небольшого интереса мне было интересно, почему это так дорого. Для 200 объектов в моей системе это занимает 4 минуты, на которые 90 +% времени тратится в DefaultAutoFlushEventListener.OnAutoFlush (благодаря RedGate Profiler). Это безумие. Интересно, написал ли кто-нибудь пользовательский DefaultAutoFlushEventListener, который временно обходит это препятствие для больших повторяющихся обновлений.

Обновление: на самом деле проблема не в массовом обновлении, а в транзакциях и FlushMode для запросов. Но все же, что, черт возьми, делает NH, когда он сбрасывает?

Ответы [ 2 ]

3 голосов
/ 13 ноября 2009

Это был хороший. У меня было каждое обновление в транзакции, и внутри этой транзакции был запрос, который кэшировался на 2-м уровне, но вызывал сброс. Если у вас есть запросы в транзакции, и FlushMode = Auto (в основном не выключен), вы получаете сброс. Что очень дорого, особенно если у вас много объектов в кеше сессии, что мы и делаем. Удалив этот запрос из транзакции, увеличил время запроса в 5 раз. Более того, сделав все это транзакцией, а не отдельными транзакциями, это стало еще одним большим стимулом, поскольку каждая транзакция.commit вызывает сброс. Обновление 1000 объектов занимает менее 30 секунд, и я слишком смущен, чтобы сказать, как долго это было раньше. Ааа старый код.

Обновление: при дальнейшем исследовании я установил для FlushMode значение Commit для нашей конкретной модели вложенных транзакций. Не вдаваясь в подробности, мы имеем конкретную модель транзакций, которая учитывает вложенные транзакции при использовании вложенных вызовов «логики». Для устаревших приложений мы не хотим устанавливать это повсеместно. Особой проблемой в этом случае является сочетание использования транзакций и установки для параметра FlushMode значения Auto (или Always).

1 голос
/ 13 ноября 2009

Хотя стандартный сеанс ISession не рекомендуется для массовых операций, вместо него можно использовать сеанс без сохранения состояния или DML .

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