(Свободно) События прогресса NHibernate для длительных транзакций? - PullRequest
1 голос
/ 24 ноября 2011

Мы подключили событие ISaveOrUpdateEventListener и надеялись, что сможем связать его с обновлением индикатора выполнения для каждого узла, посещаемого во время обхода сохранения довольно большой модели, НО событие запускается только один раз, когда запускаются операции сохранения (только на узле, на котором было инициировано Save (), а не на каких-либо подузлах).

Есть ли какие-либо другие события, которые более уместны для прослушивания?

Мы также пытались разбить операцию сохранения (иерархической модели), выполняя обход сами, но, похоже, это еще больше снижает производительность.

Возможно, мы пытаемся решить проблему, для которой FNH не был предназначен для использования. Мы новички в этом.

Мы также создали альтернативное решение с использованием SqlBulkCopy, как рекомендовано в другом месте.

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

Справка:

Мы пытаемся использовать Fluent NHibernate в более крупном проекте базы данных с данными, собранными в результате довольно сложного анализа в реальном времени (высокая частота, множественные входные сигналы, длительное время эксперимента и т. Д.). В построенном нами прототипе мы видим довольно страшные времена ожидания, и нам нужно подключить какой-то надежный индикатор прогресса.

1 Ответ

0 голосов
/ 25 ноября 2011

Да, теперь подтверждено - как уже упоминалось в моем комментарии выше.Одно (возможное) решение этой проблемы - просто повернуть каскады, выполнить обход модели вручную и выполнить явные вызовы Save ().

Это работает, хотя и не так аккуратно, как просто обработка события.Тем не менее, учитывая оригинальный дизайн NHibernate, держу пари, что где-то наверняка есть событие, которое можно было бы перехватить - вопрос только в том, под каким именем.... Держу пари, кто-то здесь знает больше.

Кроме того, для повышения производительности мы использовали сеанс без сохранения состояния, экспериментировали с разным размером пакета и периодически / явно вызывали Flush () и Clear ().См. Статьи ниже для получения дополнительной информации:

http://davybrion.com/blog/2008/10/bulk-data-operations-with-nhibernates-stateless-sessions/

http://ideas -net.blogspot.com / 2009/03 / nhibernate-update-performance-issue.html

Надеюсь, это поможет.

...