Haz streaming en vez de materializar: lee con un cursor desplazable o con paginación por clave, pon un fetch size para que el driver no lo bufferice todo, y procesa en trozos con un commit por trozo. Si usas JPA, limpia el contexto de persistencia entre trozos o usa una sesión sin estado, o si no cada entidad se queda en la caché de primer nivel. Agrupa las escrituras con batching de JDBC, y haz el trabajo reiniciable desde su último trozo confirmado.
Por qué lo preguntan los entrevistadores
El trabajo batch es donde el comportamiento de la memoria de la JVM y el del contexto de persistencia se vuelven evidentes, así que esto prueba experiencia práctica y no teoría. El entrevistador quiere streaming, commits por trozos, limpieza del contexto de persistencia y reiniciabilidad. Saber que un driver JDBC puede bufferizar el resultado entero sin importar tu código, salvo que el fetch size y los ajustes de transacción sean los correctos, es una señal fuerte.
Cómo estructurar tu respuesta
- Descarta cargarlo todo: haz la lectura en streaming o paginada.
- Explica el fetch size y el comportamiento de bufferizado del driver.
- Maneja el contexto de persistencia para que las entidades no se acumulen.
- Añade commits por trozos, escrituras agrupadas y reiniciabilidad.
Ejemplo de respuesta
La regla central es que ningún paso sostiene veinte millones de nada. Leo con paginación por clave sobre la clave primaria, o con un cursor desplazable con un fetch size explícito, y vale la pena saber que algunos drivers lo ignoran y bufferizan el conjunto de resultados entero salvo que además corras dentro de una transacción con autocommit desactivado, algo que la gente descubre por las malas cuando el heap se llena antes de procesar nada. Luego proceso en trozos de unos miles, escribo con batching de JDBC para que sea un viaje por trozo y no por fila, y confirmo por trozo. Con JPA la trampa extra es el contexto de persistencia: cada entidad leída queda gestionada, así que la memoria crece y los flush se vuelven más lentos según el dirty checking recorre más objetos. Lo limpio en cada trozo o uso una sesión sin estado. La reiniciabilidad importa tanto como la memoria, así que el trabajo registra la última clave confirmada, lo que significa que un fallo en la fila dieciocho millones reanuda en vez de empezar de nuevo. Y lo limito, porque un batch que satura la base de datos a las dos de la mañana sigue golpeando a quien esté despierto.
¿Tienes esta entrevista a la vuelta de la esquina? GhostPilot escucha tu llamada en vivo, detecta la pregunta en cuanto la hacen y pone una respuesta estructurada en tu pantalla en tiempo real. Pruébalo en tu próxima entrevista de práctica, o coge un Session Pass de $29, sin suscripción, para la de verdad.
Mira cómo funcionaPreguntas de seguimiento que puedes esperar
- ¿Por qué se ralentiza el contexto de persistencia a medida que crece?
- ¿Cómo paralelizarías esto de forma segura entre particiones?
- ¿Cómo haces la transformación idempotente para un reinicio?
Más preguntas para Desarrollador Java
Tu entrevistador hará su propia versión de esta. Pega la descripción real del puesto en el Question Predictor gratuito y obtén las 20 preguntas que ese puesto tiene más probabilidades de hacerte, con lo que cada una busca en realidad.
Predecir mis preguntas