2012-01-04 12 views
13

Estoy creando un sistema, donde cada solicitud del lado del cliente genera múltiples subprocesos en el lado del servidor. Cada hilo está usando uno o más DAO (algunos DAO pueden ser utilizados por más de un hilo a la vez). Todos los DAO se inyectan (@Autowired) a mis clases de hilo por Spring. Cada DAO recibe SessionFactory inyectado también.Gestión de sesiones de Spring + Hibernate en varios subprocesos

¿Cuál sería la forma correcta de administrar sesiones de Hibernate en estos DAO múltiples para no tener problemas debido al entorno multiproceso (por ejemplo, pocos DAO de diferentes hilos intentan usar la misma sesión al mismo tiempo)?

¿Sería suficiente que especifique hibernate.current_session_context_class=thread en la configuración de Hibernate y luego cada vez en DAO simplemente use SessionFactory.getCurrentSession() para hacer el trabajo? ¿Detectaría adecuadamente y crearía sesiones por hilo según sea necesario?

Respuesta

15

Sí. Es suficiente.

Al establecer hibernate.current_session_context_class en thread, la sesión devuelta desde SessionFactory.getCurrentSession() es de la instancia ThreadLocal.

Cada hilo tendrá su propia instancia, independientemente ThreadLocal, por lo que diferentes hilos no tendrán acceso a la misma sesión de hibernación.

El comportamiento de SessionFactory.getCurrentSession() es que: si se llama por primera vez en el hilo actual, se abre y se devuelve una nueva sesión. Si se llama nuevamente en el mismo hilo, se devolverá la misma sesión.

Como resultado, puede obtener la misma sesión para usar en diferentes métodos DAO en el mismo código de transacción simplemente llamando al SessionFactory.getCurrentSession(). Le impide pasar la sesión de Hibernate a través de los parámetros de entrada del método DAO en caso de que tenga que llamar a muchos métodos DAO diferentes en el mismo código de transacción.

+3

¿Qué hay de cerrar la sesión cuando el trabajo está hecho, se realiza automáticamente? – MounirReg

+1

Cuando está Hibernate con Spring 3 o posterior, debe evitar establecer esta propiedad ya que Spring tiene su propia implementación de esto que es necesaria para que Spring administre las sesiones de Hibernate. http://stackoverflow.com/a/18842593/3826713 – UCJava

Cuestiones relacionadas