Oi pessoal, eu trabalho em uma aplicação que trabalha com processamento de arquivos. Um dos desafios agora é importar e ler um arquivo de mais de 400mb, com mais de 20 milhões de linhas. A minha duvida é saber qual das duas opções é a melhor considerando que estou usando jpa.
abrir uma única transação e dar um persist gravando com o cascade todos os objetos
controlar manualmente as transações, comitando a cada XXX registros
A leitura do arquivo populando meu objeto nao gasta nem dois minutos. Mas minha inclusão, do momento que mando gravar, gasta quase 20 minutos.
Gostaria de diminuir esse tempo, sendo que o que esta funcionado hoje é usando o cascade.
javaCBA,
Vc esqueceu de citar qual banco(e versão) vc usa.Até pq alguém acaba citando algo para você utilizar(como SQL loader do Oracle), e descobre que você está com outro banco…
Não vou mentir, 20 milhões(e 400MB) é osso, mas eu já fiz importação com insert(só no JDBC + executeBatch) para um milhão de registros(com 20 colunas) e demorou menos de 10 segundos(em um i7 desktop) num oracle 10g, mas eram só 20MB de dados.
Eu realmente não acredito que 20 minutos de maquina/dia sejam um impeditivo para a maioria dos casos, mas como não conheço o domínio não tenho nem como expressar minha opinião nesse caso.
Todas as vezes que eu precisei otimizar acesso ao banco de dados, inevitavelmente tive que abandonar o ORM e apelar pra SQL na mão. Considere essa hipótese.