2009-11-13 10 views
9

In pratica stiamo trovando il valore predefinito NHibernate (v2.0 & 2.1) FlushMode = Auto per essere estremamente costoso. La revisione della fonte di NHibernate suggerisce che gli algoritmi per determinare ciò che deve essere svuotato si basano sulla forza bruta del looping attraverso tutte le entità nella sessione e ciò si verifica per ogni query eseguita in una transazione.Perché il controllo AutoFlush di NHibernate è così costoso?

In alcuni scenari di produzione con aggiornamenti su molti articoli, con più query abbiamo visto il processo 100 volte più lungo con FlushMode = Auto rispetto a FlushMode = Commit.

ogni pensiero// migliori pratiche consigli per l'uso di FlushMode quando si esegue la logica 'complessa' sessione che coinvolge più aggiornamenti, le query multiple ecc

Tutte le idee su come ottimizzare gli algoritmi autoflush in NHibernate?

+0

domanda relativa: http://stackoverflow.com/questions/1724307/nhibernate-poor-performance-on-auto-flush-events – zvolkov

+0

sì ... in realtà lo stesso problema :) – Pawel

risposta

6

Questa lentezza è un problema noto e viene monitorato in NH Jira come NH-1365

Ci sono tre modi filo in NH:

  • FlushMode.Auto = filo quando necessario (a impegnare e prima query, se necessario). Questo è l'impostazione predefinita.
  • FlushMode.Commit = flush on commit della transazione NH solo
  • FlushMode.Never = mai flush (fino a quando viene chiamato Flush). Questo sarà still go to DB sull'inserimento di entità che utilizzano il generatore PK nativo (identità).
+0

Grazie, Felice di sapere è un problema noto. Triste sapere che è un problema noto da oltre un anno! Apprezzo che ci siano molti modi per riordinare il codice per limitare il numero di flush eseguiti. Tuttavia, sembra che le prestazioni di flushing in Nhibernate siano molto più lente di quanto dovrebbero essere. – Pawel