Pergunta de entrevista para Desenvolvedor Java

Você precisa de um job noturno que leia vinte milhões de linhas, transforme e grave os resultados. Como você o escreve para não esgotar a memória?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

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

Exemplo falado, em primeira pessoa

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 funciona

Perguntas 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

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot