sábado, 21 de febrero de 2009

Hibernate caching basics

En Hibernate hay dos tipos de cache: el First Level y el Second Level.
  • First Level Cache (asociada con el objeto Session)
    • Mantenido auntomaticamente por Hibernate cuando dentro de una Transaction interactuamos con la base de datos, en éste caso se mantienen en memoria los objetos que fueron cargados y si mas adelante en el flujo del proceso volvemos a necesitarlos van a ser retornados desde el cache, ahorrando accesos sobre la base de datos. Esto implica que si un objeto es modificado muchas veces dentro de la misma Transaction, Hibernate generará solamente un SQL UPDATE al final de la Transaction.
    • Es válido solamente entre el begin() y el commit() de una Transaction, en forma aislada a las demás.
    • Hibernate lo maneja por defecto, no hay que configurar nada, si por alguna razón queremos deshabilitar o evitar el uso del cache, podemos usar un tipo especial de session: StatelessSession, se obtiene de la sessionFactory con el método openStatelessSession(). Es usada para procesos batch, por ejemplo si hay que hacer inserts o updates masivos, evitando que cada vez que se hace el save de un objeto, el mismo me quede en memoria y en el correr del proceso se produzca un error del tipo OutOfMemoryError. La StatelessSession no interactúa con el First Level Cache ni con el Second Level Cache, es casi como si utilizáramos JDBC directamente.
  • Second Level Cache (asociada con el objeto SessionFactory)
    • Se utiliza para mejora de la performance.
    • Es válido para todas las transacciones. Mantiene objetos cargados a un nivel de SessionFactory mas allá de la duración de las muchas Transaction que podamos tener.
    • Los objetos en la L2 cache están disponibles durante toda la aplicación. Lo podríamos considerar como un cache global.

No hay comentarios:

Publicar un comentario