Gestión de sesión NHiernate en Asp.Net
Autor:Eve Cole
Fecha de actualización:2009-06-30 16:46:38
La sesión en NHibernate parece ser equivalente a una conexión de base de datos, según tengo entendido. Debido a que también tiene métodos Abrir/Cerrar, no he estudiado el código fuente de NHibernate. Me pregunto si esta comprensión es incorrecta. Busqué mucho sobre la administración de sesiones en Internet. La mayoría de ellos son OpenSession () cuando necesito operaciones de base de datos y CloseSession () después de la operación. Esto es un poco similar a cuando comenzamos a aprender ADO.NET. ) el objeto Connection y luego Close() después de procesar los datos. Pero esto trae un inconveniente, porque el cambio frecuente de Connection consume recursos del sistema. Recuerdo cuando estaba creando una interfaz de entrada de datos antes, porque esta interfaz de entrada tenía muchos elementos de datos y se necesitaban muchas DropDownLists para leer datos en la base de datos y vincularlos.
De esta manera, en el Page_Load de la página, los métodos de los objetos correspondientes deben llamarse uno por uno para recuperar el enlace de datos DropDownList de la base de datos. Debido a que nuestros métodos utilizan conexiones independientes, todos tienen sus propias conexiones. propia Apertura y Cierre de la Conexión. Por lo tanto, lleva mucho tiempo abrir esta página, que es relativamente lenta. Más tarde, procesamos los datos que debían vincularse a DropDownList en un DataSet y vinculamos la DataTable en el DataSet a DropDownList. De esta manera, solo se requiere una apertura/cierre de conexión. La página es mucho más rápida.
Por lo tanto, creo que el método de gestión de sesiones anterior no es muy apropiado.
Más tarde, miré su gestión de sesiones en el proyecto de código abierto Cuyahoga y utilizó el modelo de "sesión por solicitud".
El entendimiento literal es que crea una sesión para cada solicitud hasta que se destruye la solicitud, luego se cierra la sesión.
El enfoque de Cuyahoga es un poco diferente del de sesión por solicitud en que crea un objeto CoreRepository para cada Solicitud. CoreRepository es la clase de servicios de procesamiento de datos requeridos por el sistema.
Lo que hizo fue crear primero HttpModule (NHSessionModule) para crear objetos CoreRepository y destruir objetos CoreRepository, de la siguiente manera:
privado vacío Context_BeginRequest (remitente del objeto, EventArgs e)
{
// Crea el repositorio para objetos Core y agrégalo al HttpContext actual.
CoreRepository cr = nuevo CoreRepository (verdadero);
HttpContext.Current.Items.Add("CoreRepository", cr);
}
privado vacío Context_EndRequest (remitente del objeto, EventArgs e)
{
// Cierra la sesión de NHibernate.
si (HttpContext.Current.Items["CoreRepository"]! = nulo)
{
CoreRepository cr = (CoreRepository)HttpContext.Current.Items["CoreRepository"];
cr.CloseSession();
}
}
De esta manera, el objeto CoreRepository se creará automáticamente cada vez que se realice una solicitud. Cuando se complete la solicitud, CloseSession () se puede usar para obtener el objeto CoreRepository a través de HttpContext.Current.Items ["CoreRepository"] en el programa.
De esta forma, la sesión en NHibernate se gestiona de forma disfrazada y se logra el modelo de "sesión por solicitud".
Explicación detallada: inicialice la sesión de Nhibernate implementando IHttpModule
En comparación con el método anterior, que requiere crear una sesión para cada operación, este método debería mejorar mucho el rendimiento y la velocidad.
Entonces pensé, cada solicitud crea una sesión. ¿Podemos también crear un grupo de sesiones como el grupo de conexiones?
De esta manera, en lugar de crear una sesión directamente cada vez que se realiza una solicitud, la sesión ya creada se toma de nuestro grupo de sesiones. ¿No es esto más eficiente? !
http://maplye.cnblogs.com/archive/2006/06/26/435683.html