2009-05-29 13 views
5

Recién comenzamos a utilizar Hibernate y todavía nos estamos acostumbrando a la forma en que funciona.Cómo forzar a hibernar a liberar memoria una vez que se cierra la sesión?

Una de las cosas que hemos visto es que incluso después de que todas las sesiones se cierran y las referencias han salido del alcance, hibernate aún parece mantener los valores de base de datos usados ​​previamente en su caché.

Tenemos un código que lee de un conjunto de tablas en varias pasadas. Debido a que toda la memoria se libera con moderación, los pases posteriores se ralentizan hasta convertirse en un rastreo.

¿Hay alguna manera de forzar a Hibernate a borrar su caché?

Una llamada explícita a System.gc() no ayuda. (Sí, sé que es una sugerencia)

Información adicional: Hemos inhabilitado explícitamente la memoria caché de segundo nivel.

+3

Asumo que no está utilizando la memoria caché de segundo nivel de Hibernate entonces? ¿Qué estrategia estás utilizando para la gestión de sesiones? "Sesión por hilo"? –

+0

Estamos usando session-per-thread, y hemos inhabilitado explícitamente el caché de segundo nivel – StudioEvoque

Respuesta

10

Puede intentar llamar a Session.clear para forzar el borrado de la memoria caché de primer nivel. Asegúrese de llamar a Session.flush primero para escribir cualquier cambio pendiente en la base de datos. Si eso "soluciona" el problema, entonces sospecho que algo todavía contiene una referencia a la sesión, lo que impide que los objetos en la memoria caché sean recolectados. Es posible que necesite obtener un volcado de pila de su programa para rastrear la fuga.

+0

"Solucionó" el problema :) Como sugirió, estamos revisando algunos de nuestros "HibernateUtils" creados para ver dónde estamos estamos aferrados a las referencias de sesión. – StudioEvoque

+0

Es posible que también desee considerar el uso de un marco como Spring para administrar sus sesiones y transacciones de Hibernate si aún no lo ha hecho. –

+0

¡Gracias, esta sugerencia me ayudó a solucionar un problema que ha estado matando mi aplicación java en los últimos días! – mahonya

2

Hibernate también tiene un caché de segundo nivel opcional que podría estar en juego. Estoy de acuerdo con Rob, la forma más fácil de averiguar es ver qué hay en la memoria una vez que finaliza la sesión.

Mi herramienta favorita actual para esto es YourKit que es comercial y no es precisamente barata. Solían ofrecer (y aún pueden ofrecer) una opción de licencia personal que era muy económica ($ 99 IIRC). He utilizado YourKit para precisamente esta tarea al solucionar problemas de uso de heap con Alfresco ECM. Hay otras herramientas disponibles (por ejemplo, CodeGear JGears) que, según tengo entendido, también funcionan muy bien.

Se podría considerar el uso de un producto en modo de evaluación - si esto encuentra su problema podría ganarse su sustento;)

+0

Si explict GC no ayuda, los objetos todavía se deben referenciar en algún lugar de su código. Un generador de perfiles con detección de fuga de memoria es la ruta más rápida a una respuesta en mi humilde opinión, ya que * verá * la ruta que causa la fuga. ¡La mejor de las suertes! –

Cuestiones relacionadas