¿Es malo no deshacerse de ISession

Tengo NHibernate conectado en mi aplicación asp.net mvc

La ISession se inyecta en el repositorio. No puedo usar el patrón de sesión por solicitud porque necesito una sesión por enfoque de conversación.

NHibernate ISession se utiliza en varias solicitudes http. El gráfico del objeto es grande y no quiero cargar el gráfico completo en cada solicitud. Es por eso que la ISession se almacena en la HttpSession de los usuarios.

El ciclo de vida de ISession se configura con StructureMap:

For<ISession>().LifecycleIs(new HttpSessionLifecycle()).Use(x =>
{
    var sessionSource = x.GetInstance<ISessionSource>();
    return sessionSource.CreateSession();
});

Al final de la conversación llamo

Session.Clear()

para borrar la ISession.

Cuando el usuario crea una nueva conversación, StructureMap crea una nueva ISession. No encontré la manera de deshacerme de la ISession.

Entonces, ¿es malo no desecharlo? ¿Tiene conexiones con la base de datos?

preguntado el 01 de febrero de 12 a las 22:02

Si no implementa IDisposable entonces ... bueno, entonces no hay Dispose () y Disposable no tiene sentido. ¿Qué dicen los doctores? -

ISession es desechable y, como mejor práctica, debe desecharse. Pero la ISession en mi aplicación debe abarcar varias solicitudes de página:

Cuando dice que no puede usar una sesión por patrón de solicitud porque necesita una sesión por patrón de conversación, ¿quiere decir que desea mantener la sesión en múltiples solicitudes http para el mismo usuario? Si pudiera explicar más su caso de uso, sería útil comprender su problema. Gracias. -

¿Es una opción para separar the object graph y guardarlo en tu sesión web? -

El gráfico de objetos se guarda actualmente en la sesión web, pero no se separa. No tengo experiencia en separar / adjuntar con nhibernate, pero he leído que debería omitirse si es posible. -

2 Respuestas

En general, NHibernate no mantendrá la conexión abierta a la base de datos por más tiempo de lo necesario. Utiliza el grupo de conexiones de SQL Server para obtener conexiones rápidamente y devolverlas. Entonces, en términos de conexión abierta, no es un problema no disponer de una sesión.

Pero la sesión también realiza un seguimiento de todos los cambios en las entidades y los descarga en la base de datos en la transacción de eliminación / confirmación, solo tenga en cuenta que esta función está ahí y podría perseguirlo

Respondido 02 Feb 12, 15:02

También tenga en cuenta el siguiente problema:

https://nhibernate.jira.com/browse/NH-3046

En algunos escenarios (si no utiliza transacciones o si a menudo realiza la reversión de transacciones), las sesiones de larga duración pueden "comer" mucha memoria. Pero toda la memoria asignada se liberará cuando GC elimine y recopile la sesión.

Respondido 14 Feb 14, 13:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.