Diego's weblog - Developer's notes
martes abril 17, 2007
Open Session In View, Spring & Hibernate Estuve analizando las diferentes posibilidades que existen dentro del Spring Framework para la implementación del "pattern" Open session in view.
Spring propone dos formas:
- Single Session: En donde un Servlet Filter abre la session de Hibernate, esta session es utilizada por todos los servicios llamados desde la capa web (por ejemplo backing beans). Esto es posible gracias al uso de TransactionInterceptor y la plataforma de TransactionManager de Spring
- Deferred Session: En este caso se van registrando "maginamente" todas las sessiones que Spring va abriendo a medida que se invocan los servicios para que luego un Servlet Filter cierre todas estas sessiones
Probe ambos mecanismos y encontre el primero tiene dos problema grave (al menos es lo que yo encontre)
- Al estar utilizando la misma session en todo el request, es imposible cargar dos objetos con el mismo id
- Algunos objetos puede quedan en la session y al querer ser utilizads mas adelante puede no representar la informacion cargada en la base de datos.
Por ejemplo:
Grupo grupo = new Grupo();
grupo.setId(form.getIdGrupo());
empresa.setGrupo(grupo);
El objeto grupo queda en la session actual y si luego es consultado para ser mostrado en una tala por ejemplo, la descripcion seria null. Para resolver este problema hay que cargar el objeto grupo utilizando un load().
Grupo grupo = servicio.findById(form.getIdGrupo()); // cargo el objeto
empresa.setGrupo(grupo);
En el mecanismo de deferred session encontre que para ciertas consultas se pueden abrir una gran cantidad de sessiones, por lo que hay que tener en cuenta esto para definir el tamaño del pool de conexiones
( abr 17 2007, 04:47:34 PM ART )
Permalink