3
respostas

Como fazer insert de milhares de linhas?

Qual a maneira correta de gravar milhares ou milhões de linhas numa tabela? Quando chamo a função entityManager.persist() em um loop, só grava apenas uma linha no banco.

3 respostas

Seria bom mostrar o seu código e a chave primária da sua tabela. Veja se não está ocorrendo erro de duplicidade no momento da gravação ou se no loop entra apenas uma vez no insert.

Consegui resolver a questão da gravação das linhas. Eu estava usando o mesmo objeto para todas as linha. Porém ainda estou procurando uma estratégia para gravar grandes quantidades de linhas no banco, seja tudo de uma só vez ou em blocos.

Olá Nailton!

Para inserir milhares ou milhões de linhas em uma tabela, é importante considerar algumas técnicas que podem ajudar a melhorar a performance do seu código.

Uma das técnicas que pode ser utilizada é o batch processing, que consiste em agrupar várias operações em um único comando SQL, reduzindo assim a quantidade de chamadas ao banco de dados. No caso do Hibernate, é possível utilizar o método entityManager.flush() para forçar o envio das operações pendentes para o banco de dados em lotes.

Segue um exemplo de como utilizar o batch processing com o Hibernate:

EntityManager entityManager = getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();

for (int i = 0; i < listaDeObjetos.size(); i++) {
    entityManager.persist(listaDeObjetos.get(i));
    if (i % 50 == 0) { // envia as operações pendentes a cada 50 operações
        entityManager.flush();
        entityManager.clear();
    }
}

transaction.commit();

Neste exemplo, a cada 50 operações, as operações pendentes são enviadas para o banco de dados e o cache do Hibernate é limpo, melhorando assim a performance do código.

Espero ter ajudado e bons estudos!