estoy desarrollo y aplicación que se ejecuta como un servicio de Windows. Existen otros componentes que incluyen algunos servicios WCF, una GUI de cliente, etc., pero es el servicio de Windows el que accede a la base de datos.NHibernate gestión de sesiones en aplicaciones de servicio de Windows
Por lo tanto, la aplicación es un servidor de larga duración, y me gustaría mejorar su rendimiento y escalabilidad, que estaba buscando para mejorar el acceso de datos, entre otras cosas. Publiqué en otro hilo sobre el almacenamiento en caché de segundo nivel.
Este post es sobre la gestión de sesiones para el hilo de larga duración que tiene acceso a la base de datos. ¿Debo utilizar un contexto estático de subprocesos? Si es así, ¿hay algún ejemplo de cómo se implementaría?
Cada uno alrededor de la red que está utilizando NHibernate parecen estar muy centrado en las arquitecturas de estilo de aplicaciones web. Parece haber una gran falta de documentación/discusión para diseños de aplicaciones que no sean web.
Por el momento, mi largo hilo conductor hace esto:
- Llamada 3 o 4 métodos DAO
- Verificar el estado de los objetos separados regresó.
- Actualice el estado si es necesario.
- Llame a un par de métodos DAO para conservar las instancias actualizadas. (pase el ID del objeto y la instancia en sí; el DAO recuperará el objeto del DB nuevamente y establecerá los valores actualizados y session.SaveOrUpdate() antes de confirmar la transacción.
- Sleep for 'n' seconds !
- Repetir todo de nuevo
por lo tanto, el siguiente es un patrón común que utilizamos para cada uno de los métodos DAO:
- sesión abierta usando sessionFactory.openSession()
- iniciar la transacción
- Do db work. recuperar/actualizar etc
- Commit trans
- (Rollback en caso de excepciones)
- Por último siempre disponer de transacciones y session.close()
Esto sucede por cada llamada de método a una clase DAO . Sospecho que esto es una especie de anti-patrón de la forma en que lo estamos haciendo.
Sin embargo, no soy capaz de encontrar suficiente dirección en cualquier lugar en cuanto a cómo podemos mejorarlo.
Nota: mientras este hilo se ejecuta en segundo plano, haciendo sus cosas, hay solicitudes provenientes de los clientes de WCF cada una de las cuales podría hacer 2-3 llamadas DAO - a veces consultando/actualizando los mismos objetos por mucho tiempo hilo conductor trata con.
Cualquier ideas/sugerencias/consejos para mejorar nuestro diseño será apreciado considerablemente. Si podemos conseguir una buena discusión va, podríamos hacer de esto una wiki de la comunidad, y possbily vincular a aquí de http://nhibernate.info
Krishna
+1. He visto este consejo general varias veces: SessionFactory es costoso. Solo créelo una vez. Las sesiones son baratas. – snicker