Desea una estrategia de administración de sesión que permita que su aplicación funcione de manera efectiva y aproveche las ventajas que le ofrece NHibernate, especialmente el almacenamiento en caché y la carga diferida.
Crear sesiones es un proceso poco costoso y requiere poca RAM o CPU por adelantado, por lo que no debe preocuparse por conservar o volver a utilizar las sesiones (de hecho, volverlas a utilizar puede llevar a un lado desagradable e inesperado -efectos). La fábrica de sesiones es lo más caro y debe construirse una vez y solo una vez en el inicio de la aplicación.
La regla general es la siguiente: la duración de la sesión tiene que ser lo suficientemente largo que no tiene objetos persistido dando vueltas en su alcance después de que termine la sesión.
Una vez que termine la sesión, todo cambio rastreo de objetos que obtuvo de esa sesión se detiene, por lo que esos cambios no ser salvo a menos que deliberadamente volver a conectar ese objeto a una nueva sesión. Por lo tanto, la sesión debería permanecer activa mientras existan los objetos que obtenga de ella. En una aplicación web, eso generalmente significa una sesión para cada solicitud; en WinForms, una sesión para cada formulario.
En su caso, con un servicio (supongo que está funcionando como un servicio de Windows) haciendo el trabajo NHibernate, es posible que desee considerar la posibilidad de una sesión creada para cada nueva solicitud de la aplicación de escritorio que consume, y disponerla cuando esa solicitud ha sido atendida. Sin saber exactamente cómo se ejecuta su servicio y qué mecanismo utiliza la aplicación de escritorio para hablar con él (¿remoto? ¿WCF? ¿Llamar a SOAP?) En realidad, no puedo ser más específico.
(Existen algunas excepciones a esta regla general: supongamos que tiene un conjunto de objetos persistentes que representan un recurso compartido al que otro código hará referencia pero no cambia, puede cargarlos por adelantado al inicio de la aplicación y salir ellos se desconectaron de allí en adelante)
Si encuentra que el rendimiento es lento bajo tal estrategia, es posible que solo esté hablando demasiado con la base de datos y su gráfico de objetos sea complejo; mira second-level caching en este caso.
En tu pregunta http://stackoverflow.com/questions/2011950/nhibernate-mappings-issue-when-referencing-class-lazy-load-issue me pediste que investigara esta nueva pregunta, pero te veo ' Ya he recibido una amplia cobertura. Opino algunas de las opiniones aquí, pero tenga en cuenta que parece que las sesiones y las transacciones se entremezclan en la discusión, mientras que esas son cosas diferentes. Además, un grupo de sesiones o una sesión desencadenada por tiempo de espera puede ser beneficioso en términos de rendimiento, pero es difícil de configurar y acertar. También tenga en cuenta que bajo la capucha, la agrupación de conexiones se utiliza independientemente de su patrón elegido. – Abel
Gracias por su comentario Abel. En ejemplos, he visto que las sesiones y transacciones a menudo comparten la misma duración, pero como se ve en la pregunta a la que se hace referencia, a veces puede ser un problema. Espero que la gente haya respondido a "duración de la sesión", no a "duración de la transacción". la impresión de que este es el caso. – stiank81