Asociaciones de hibernación que usan demasiada memoria

Sí, puede usar un generador de perfiles de memoria, como visualvm o yourkit, para ver qué necesita tanta memoria. Una forma es obtener un volcado de almacenamiento dinámico y luego cargarlo en una de estas herramientas.

Sin embargo, también debe asegurarse de comparar manzanas con manzanas. Sus consultas en el caso # 2sessionFactory.openSession().createQuery("from Student where class_id = :classId"); sessionFactory.openSession().createQuery("from Teacher where class_id = :classId");

selecciona estudiantes y maestros solo para una clase, mientras que en el caso # 1 seleccionas mucho más. Necesitas usar <= :classIden su lugar.

Además, es un poco extraño que necesites un registro de un estudiante y un maestro por clase. Un maestro puede enseñar más de una clase y un alumno puede estar en más de una clase. No sé qué problema exacto está resolviendo, pero si un estudiante puede participar en muchas clases y un maestro puede enseñar más de una clase, probablemente tendrá que diseñar sus tablas de manera diferente.

Respuesta 1

Es probable que la razón sea el vínculo bidireccional de estudiante a clase y clase a estudiantes. Cuando obtiene la Clase A (id 4500), el objeto de la Clase debe estar hidratado, a su vez, esto debe ir y extraer todos los objetos del Estudiante (y presumiblemente los maestros) asociados con esta clase. Cuando esto sucede, cada objeto del alumno debe estar hidratado. Lo que provoca la búsqueda de cada clase de la que el estudiante es parte. Entonces, aunque solo quería la clase A, termina con:

Obtener clase A (id 4900) Devuelve la clase A con referencia a 3 estudiantes, estudiante A, B, C. El estudiante A tiene referencia a la clase A, B (id 5500) La clase B necesita hidratarse La clase B tiene referencia a los estudiantes C, D estudiante C necesita hidratarse El estudiante C solo tiene referencia a la clase A y B de hidratación completa del estudiante C. El estudiante D necesita hidratación El estudiante D solo hace referencia a la clase B hidratación completa del estudiante B Clase B hidratación completa El estudiante B necesita hidratación (de la carga de clase original clase A)

etc ... Con una búsqueda ansiosa, esto continúa hasta que todos los enlaces estén hidratados. El punto es que es posible que termines con clases en la memoria que realmente no querías. O cuya identificación no es inferior a 5000.

Esto podría empeorar rápidamente.

Además, debe asegurarse de anular el código hash e iguales métodos. De lo contrario, puede obtener objetos redundantes, tanto en la memoria como en su conjunto.

Una forma de mejorar es cambiar a la carga LAZY como otros han mencionado o romper los enlaces bidireccionales. Si sabe que solo tendrá acceso a los estudiantes por clase, entonces no tenga el enlace de estudiante a clase. Para el ejemplo de estudiante / clase, tiene sentido tener el enlace bidireccional, pero tal vez se pueda evitar.

Respuesta: 2

En la carpeta / res / raw / de mi aplicación, tengo: file1.ogg file2.ogg ... fileN.ogg En una base de datos local, tengo las referencias a los nombres de archivo, es decir, file1 file2 ... fileN. Dada una de esas cadenas, ...

¿La biblioteca java.time proporciona una forma consolidada de analizar toda la Especificación de duración ISO-8601? La referencia de Alexa Slot Type para la duración enumera algunas cadenas de ejemplo que se pueden esperar al usar ...

Soy principiante y me mantengo en manos. Necesito probar este método: escribir / leer en / desde el archivo. ¿Puedes obtener consejos? ¿Qué mejor puedo hacer esto, usar solo prueba junit o mejor EasyMock? Que puedes ...

Estoy creando una extensión Keycloak con dependencias. Agregué la entrada en el pom.xml así: <dependency> <groupId> org.json </groupId> <artifactId> json </ ...