7

Sto scrivendo un semplice MVC ASP.NET utilizzando sessioni per richiesta e modelli di transazione per richiesta (HttpModule personalizzato). Sembra funzionare correttamente, ma .. le prestazioni sono terribili (una pagina semplice carica ~ 7 secondi). Per ogni richiesta HTTP, le risorse grafiche incluse (tutte le immagini sul sito) vengono create una transazione e questo sembra ritardare i tempi di caricamento (senza le transazioni i tempi di caricamento per un'immagine sono ~ 1-10 ms con transazioni che superano 1 secondo) . Qual è il modo corretto di gestire le transazioni nello stack ASP.NET MVC + NH?Gestione delle transazioni NHibernate in ASP.NET MVC: come dovrebbe essere fatto?

Quando ho inserito tutte le transazioni nei miei metodi di repository, per alcuni motivi oscuri ho ricevuto l'avviso 'transazioni implicite' in NHProf (le istruzioni SQL sono state eseguite al di fuori della transazione, anche quella in codice session.Save()/Update () I metodi/etc sono stati richiamati nell'ambito della transazione 'using' scope e prima della chiamata transaction.Commit()) BTW le transazioni implicite sono davvero negative?

+0

Perché si stanno abilitando le transazioni per le operazioni di lettura? –

+8

@Dave Swersky Poiché è consigliabile utilizzare sempre le transazioni indipendentemente dal fatto che si stia leggendo o salvando. Vedi http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions per ulteriori informazioni. –

risposta

3

È necessario utilizzare una sessione contestuale in modo che una nuova sessione e una nuova transazione non vengano create per ogni richiesta di risorsa immagine, ecc. Vedere la risposta a this question. Questo cambiamento dovrebbe migliorare significativamente le prestazioni. Questa è probabilmente anche la causa principale degli avvertimenti impliciti sulle transazioni.

Un altro problema di prestazioni frequente con le applicazioni NH è l'utilizzo di log4net con un livello DEBUG.

Modifica: Le risposte di Min e Kevin Pang sono anche un buon consiglio quindi non mi preoccuperò di ripetere le loro dichiarazioni.

+0

sessioni contestuali sono molto probabilmente per risolvere il mio problema, ma non so ancora quando dovrei iniziare il transazione? – adrin

+0

Puoi avviare e terminare la transazione nel tuo HttpModule, questo è un approccio ragionevole secondo me. Vorrei implementare prima le sessioni contestuali e vedere se si verifica ancora un problema di prestazioni prima di cercare altrove. Preferisco gestire la transazione sulla pagina in modo da poter rispondere alle eccezioni "meglio". –

4

Le transazioni implicite si verificano quando non si inseriscono le dichiarazioni in una transazione. L'implicito è che se non si dichiara esplicitamente una transazione, ognuna delle proprie dichiarazioni viene eseguita nella propria transazione. Quindi sì, è brutto Che male? Non so abbastanza su cosa stai lavorando per giudicare.

Faccio la stessa cosa che si sta facendo con la sessione per richiesta, ma non mi avvicino agli stessi numeri di prestazioni. Consiglierei di dare un'occhiata all'accensione di log4net per NHibernate e vedere cosa sta facendo. La tua applicazione dovrebbe creare solo la factory di sessione e le fabbriche di proxy una volta (gestire la factory di sessione sarebbe uno dei pochi posti in cui utilizzerei un singleton). Questa è davvero l'unica cosa che posso pensare che possa causarlo.

+0

Grazie per il suggerimento, SessionFactory viene comunque creato solo una volta nella vita dell'applicazione. – adrin

4

ci sono un paio di questioni qui:

In primo luogo, per quanto riguarda i vostri problemi di prestazioni. Stai facendo in modo che ISessionFactory venga istanziato una sola volta? È un oggetto molto costoso da creare, quindi dovrebbe probabilmente essere un singleton nella tua app Web che è stata creata su Application_Start, piuttosto che in Application_BeginRequest. La mia ipotesi sul motivo per cui si ottengono prestazioni così basse è che si sta creando una nuova ISessionFactory per richiesta anziché una sola volta per l'intera applicazione.

In secondo luogo, per quanto riguarda le transazioni implicite, non sono che non corretti, ma dal modo in cui descrivi il codice non dovresti ricevere questi errori. Sei sicuro di eseguire le tue chiamate all'interno di una transazione? È possibile che tu stia accedendo ad alcune proprietà di caricamento lento dalle pagine .aspx e .ascx che possono essere eseguite al di fuori della tua transazione.

+0

ISessionFactory viene istanziato una sola volta, sembra che invocare la sessione.BeginTransaction() richieda talvolta 1-2 secondi:/quindi ciò che causa cattive prestazioni. Sto usando il server postgresql in esecuzione su linux .. hmm forse dovrei testare con un altro db o provare un approccio che usi ActionFilters per la gestione delle transazioni – adrin

Problemi correlati