Faça streaming em vez de materializar: leia com um cursor rolável ou keyset paging, defina um fetch size para o driver não bufferizar tudo, e processe em blocos com um commit por bloco. Se você usa JPA, limpe o contexto de persistência entre blocos ou use uma sessão stateless, senão toda entidade fica no cache de primeiro nível. Faça as escritas em lote com JDBC batching, e deixe o job reiniciável a partir do último bloco commitado.
Por que os entrevistadores perguntam isso
Trabalho em lote é onde o comportamento de memória da JVM e o do contexto de persistência ficam óbvios, então isso testa experiência prática em vez de teoria. O entrevistador quer streaming, commits em blocos, limpeza do contexto de persistência e reinicialização. Saber que um driver JDBC pode bufferizar o result set inteiro independentemente do seu código, a menos que fetch size e configurações de transação estejam certos, é um sinal forte.
Como estruturar sua resposta
- Descarte carregar tudo: faça streaming ou pagine a leitura.
- Explique fetch size e o comportamento de buffering do driver.
- Trate o contexto de persistência para as entidades não acumularem.
- Adicione commits em blocos, escritas em lote e reinicialização.
Exemplo de resposta
A regra central é que nenhuma etapa segura vinte milhões de nada. Eu leio com keyset paging na chave primária, ou um cursor rolável com fetch size explícito, e vale saber que alguns drivers ignoram isso e bufferizam o result set inteiro a menos que você também rode dentro de uma transação com autocommit desligado, coisa que as pessoas descobrem do jeito difícil quando o heap enche antes de qualquer processamento começar. Aí eu processo em blocos de alguns milhares, gravo com JDBC batching para ser uma ida e volta por bloco em vez de por linha, e commito por bloco. Com JPA a armadilha extra é o contexto de persistência: toda entidade lida fica gerenciada, então a memória cresce e os flushes ficam mais lentos conforme o dirty checking percorre mais objetos. Eu limpo ele a cada bloco ou uso uma sessão stateless. Reinicialização importa tanto quanto memória, então o job registra a última chave commitada, o que significa que uma falha na linha dezoito milhões retoma em vez de começar de novo. E eu limito a taxa, porque um job em lote que satura o banco às duas da manhã ainda atinge quem estiver acordado.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Por que o contexto de persistência fica mais lento conforme cresce?
- Como você paralelizaria isso com segurança entre partições?
- Como você torna a transformação idempotente para um restart?
Mais perguntas para Desenvolvedor Java
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas