7

Estoy escribiendo un ASP.NET MVC simple usando sesión por solicitud y transacción por patrones de solicitud (HttpModule personalizado). Parece que funciona correctamente, pero ... el rendimiento es terrible (una página simple carga ~ 7 segundos). Para cada pedido HTTP, se crean recursos gráficos que incluyen todas las imágenes del sitio y esto parece retrasar los tiempos de carga (sin que los tiempos de carga de las transacciones por una imagen sean ~ 1-10 ms con transacciones de más de 1 segundo) . ¿Cuál es la forma correcta de gestionar las transacciones en la pila ASP.NET MVC + NH?Administración de transacciones NHibernate en ASP.NET MVC: ¿cómo se debe hacer?

Cuando puse todas las transacciones en mis métodos de repositorio, por alguna oscura razón recibí una advertencia de "transacciones implícitas" en NHProf (las sentencias SQL se ejecutaron fuera de la transacción, incluso en el código session.Save()/Update ()/etc métodos fueron invocados dentro de la transacción 'using' scope y before transaction.Commit() call) BTW son transacciones implícitas realmente malas?

+0

¿Por qué está habilitando transacciones para operaciones de lectura? –

+8

@Dave Swersky Porque es una buena práctica usar siempre transacciones independientemente de si está leyendo o guardando. Consulte http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions para obtener más información. –

Respuesta

3

Debe usar una sesión contextual para que no se creen nuevas sesiones y transacciones en cada solicitud de un recurso de imagen, etc. Consulte mi respuesta al this question. Este cambio debería mejorar el rendimiento significativamente. Esta es probablemente también la causa raíz de las advertencias de transacción implícitas.

Otro problema de rendimiento con aplicaciones frecuentes NH está usando log4net con un nivel de depuración.

Edición: Min y respuestas de Kevin Pang son también buenos consejos para que no me moleste repetir sus declaraciones.

+0

las sesiones contextuales muy probablemente resuelvan mi problema, pero todavía no sé cuándo debería iniciar el ¿transacción? – adrin

+0

Puede iniciar y finalizar la transacción en su HttpModule, ese es un enfoque razonable en mi opinión. Implementaré sesiones contextuales primero y veré si todavía tienes un problema de rendimiento antes de buscar en otro lado. Prefiero administrar la transacción en la página para poder responder a las excepciones "mejor". –

4

Las transacciones implícitas ocurren cuando no coloca sus estados de cuenta en una transacción. Lo implícito es que si no declaras explícitamente una transacción, cada una de tus instrucciones se ejecuta en su propia transacción. Entonces sí, es malo. Eso malo? No sé lo suficiente sobre lo que estás trabajando para juzgar.

que hacen lo mismo que está haciendo con la sesión por la petición pero no llegar a ninguna parte cerca de los mismos números de rendimiento. Yo recomendaría buscar encender log4net para NHibernate y ver qué está haciendo. Su aplicación solo debería crear la fábrica de sesiones y las fábricas proxy una vez (administrar la fábrica de sesiones sería uno de los pocos lugares en los que usaría un singleton). Eso es realmente lo único que se me ocurre que podría causarlo.

+0

Gracias por la sugerencia, SessionFactory se crea solo una vez en la vida útil de la aplicación. – adrin

4

Hay un par de cuestiones:

En primer lugar, con respecto a sus problemas de rendimiento. ¿Estás asegurándote de que ISessionFactory solo se instancia una vez? Es un objeto muy caro de crear, por lo que probablemente debería ser un singleton en su aplicación web creado en Application_Start, en lugar de en Application_BeginRequest. Mi suposición de por qué está obteniendo un rendimiento tan pobre es que está creando una nueva ISessionFactory por solicitud en lugar de una sola para toda la aplicación.

En segundo lugar, en relación con las transacciones implícitas, no son que mal, sino de la forma en que está describiendo su código no debería estar recibiendo estos errores. ¿Estás seguro de que estás ejecutando tus llamadas dentro de una transacción? Es posible que esté accediendo a algunas propiedades de carga lenta de las páginas .aspx y .ascx que se pueden ejecutar fuera de su transacción.

+0

ISessionFactory se instancia solo una vez, parece que invocando session.BeginTransaction() toma hasta 1-2 segundos a veces:/eso es lo que causa un mal rendimiento. Estoy usando el servidor postgresql ejecutándose en linux .. hmm tal vez lo probaré con otro DB o probaré un enfoque que use ActionFilters para la gestión de transacciones – adrin

Cuestiones relacionadas