(Fluente) Eventi di progresso NHibernate per transazioni lunghe?

event-listener fluent-nhibernate progress-indicator sqlbulkcopy

Domanda

Abbiamo collegato l'evento ISaveOrUpdateEventListener e sperato di poterlo collegare a un aggiornamento della barra di avanzamento per ogni nodo visitato durante l'attraversamento di salvataggio di un modello piuttosto grande, MA l'evento scocca solo una volta all'avvio delle operazioni di salvataggio (solo sul nodo su cui è stato avviato Save () e non su alcun sottonodo).

Ci sono altri eventi che sono più appropriati da ascoltare per questo?

Abbiamo anche provato a suddividere l'operazione di salvataggio (di un modello gerarchico) facendo da soli il traversal, ma questo sembra peggiorare ulteriormente le prestazioni.

Forse stiamo cercando di risolvere un problema per il quale FNH non è stato progettato per essere utilizzato. Siamo nuovi ad esso.

Abbiamo anche creato una soluzione alternativa utilizzando SqlBulkCopy, come consigliato altrove.

Abbiamo visto i commenti che FNH è principalmente previsto per le transazioni più piccole (OLTP) e non il tipo di modello esaustivo a cui siamo legati dal nostro problema (elaborazione del segnale di enormi volumi di dati).

Sfondo:

Stiamo cercando di utilizzare Fluent NHibernate su un progetto di database più ampio con dati raccolti da analisi in tempo reale abbastanza complesse (alta frequenza, segnali di input multipli, tempi lunghi di esperimenti, ecc.). In un prototipo che abbiamo costruito vediamo tempi di attesa piuttosto spaventosi per il momento, e dobbiamo agganciare una sorta di indicatore di progresso affidabile.

Risposta accettata

Sì, ora confermato - come menzionato nel mio commento sopra. Una (possibile) soluzione a questo è semplicemente girare Cascades e fare manualmente l'attraversamento del modello e fare chiamate Save () esplicite.

Funziona, anche se non è così semplice come gestire un evento. Eppure, dato il genuino design di NHibernate, scommetto che c'è un evento da qualche parte che potrebbe essere intercettato: la domanda è solo sotto quale nome. ... Scommetto che qualcuno qui sa di più.

Inoltre, per migliorare le prestazioni, abbiamo utilizzato una sessione stateless, sperimentata con dimensioni del lotto differnet e chiamata periodicamente / esplicitamente Flush () e Clear (). Vedere gli articoli di seguito per ulteriori dettagli:

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

Spero che questo ti aiuti.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché