Tengo un problema terrible que, afortunadamente, tiene una respuesta muy simple. Me estoy quedando sin memoria cuando realice una básicaSin memoria al cargar entidades Java
Si tengo código como este:
MyEntity myEntity;
for (Object id: someIdList) {
myEntity = find(id);
// do something basic with myEntity
}
Y el método find() es un método relacionado EntityManager estándar:
public MyEntity find(Object id) {
return em.find(mycorp.ejb.entity.MyEntity.class, id);
}
Este El código funcionó hace un par de semanas y funciona bien si hay menos elementos en la base de datos. El error resultante estoy enfrentando es:
java.lang.OutOfMemoryError: límite de sobrecarga GC superó
La excepción viene de vínculo superior oráculo llamar a algunos métodos JDBC de Oracle.
El bucle existe porque un EJBQL como "seleccionar el objeto (o) de MyEntity como o" sobrecargará el servidor de aplicaciones cuando haya muchos registros.
La ejecución de em.clear() no es la respuesta que estoy buscando ... pero lo tendré en cuenta. El problema con este problema es que solía funcionar ... ¡con el mismo nivel de entradas de la base de datos! Y esto plantea otra pregunta: si tengo un bucle, puedo descargar/borrar periódicamente ... pero ¿qué sucede cuando la aplicación simplemente se ejecuta durante un período prolongado? ¡El EntityManager debe administrar cuánto está administrando! –
El 'EntityManager' tiene la mayor parte del tiempo un ciclo de vida corto (el patrón común es * entitymanager-por-solicitud *). Sugiero leer [5.1. Gestor de entidad y ámbitos de transacción] (http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/#transactions-basics). Si no sigue este patrón, tendrá que lidiar con el "manejo de la memoria". El 'EntityManager' mantiene las entidades en la memoria para rastrear los cambios, así es como funciona JPA, no se puede esperar razonablemente que el' EntityManager' pueda cargar una base de datos completa o eliminar los cambios y separar las entidades por usted. –