(Fluido) ¿Evita los eventos de progreso de NHibernate para transacciones largas?

event-listener fluent-nhibernate progress-indicator sqlbulkcopy

Pregunta

Hemos conectado el evento ISaveOrUpdateEventListener y esperamos poder vincularlo a una actualización de la barra de progreso para cada nodo visitado durante el recorrido de guardado de un modelo bastante grande, PERO el evento solo se activa una vez cuando se inician las operaciones de guardar (solo en el nodo en el que se inició Save () y no en ningún subnodo).

¿Hay algún otro evento que sea más apropiado escuchar para esto?

También hemos intentado romper la operación de salvar (de un modelo jerárquico) haciendo el recorrido nosotros mismos, pero eso parece degradar aún más el rendimiento.

Tal vez estamos tratando de resolver un problema para el cual FNH no estaba destinado a ser utilizado. Somos nuevos en eso.

También hemos configurado una solución alternativa utilizando SqlBulkCopy, como se recomienda en otros lugares.

Hemos visto los comentarios de que FNH se supone principalmente para transacciones más pequeñas (OLTP) y no el tipo de modelo exhaustivo al que estamos atados por nuestro problema (procesamiento de señales de grandes volúmenes de datos).

Fondo:

Estamos tratando de usar Fluent NHibernate en un proyecto de base de datos más grande con datos recopilados a partir de un análisis en tiempo real bastante complejo (alta frecuencia, múltiples señales de entrada, largos tiempos de experimentos, etc.). En un prototipo que hemos construido, vemos tiempos de espera bastante alarmantes por el momento, y necesitamos conectar algún tipo de indicador de progreso confiable.

Respuesta aceptada

Sí, ahora confirmado - como se menciona en mi comentario anterior. Una (posible) solución a esto es simplemente desactivar Cascades y hacer el recorrido transversal del modelo manualmente y hacer llamadas explícitas en Save ()

Esto funciona, aunque no es tan simple como manejar un evento. Sin embargo, dado el diseño genuino de NHibernate, apuesto a que ciertamente hay un evento en algún lugar que podría ser interceptado, la pregunta es bajo qué nombre. ... Apuesto a que alguien aquí sabe más.

También para mejorar el rendimiento utilizamos una sesión sin estado, experimentada con diferentes tamaños de lotes, y periódicamente / explícitamente llamamos a Flush () y Clear (). Vea los artículos a continuación para más detalles:

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

Espero que esto ayude.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué