Eu estou fazendo uma aplicação que todo final de mês rodará um serviço de alta complexidade na aplicação. Esse serviço tende a ser pesado porque ele varre uma tabela com mais de 2 milhões de registros.
O que eu quero saber é se alguém sabe alguma forma de realizar esse processamento de forma menos custosa pro server e pro banco?
Eu sei que carregar esses registros, processar…para depois gravar o resultado, mataria meu servidor.
Carregar um por um e fazer isso individualmente também não acho uma boa idéia.
No caso o resultado que eu guardo é em um pdf.
Para simplificar, o cenário seria esse:
Pego uma tabela com diversos tipos de transações…efetuo os calculos e gero boletos. Esses boletos sao todos acumulados em um documento pdf.
Eu quero ideia para processar todos esses milhoes de registros…de forma que se o processamento seja interrompido eu nao perca dados, nem tenha que vlltar do zero. E todos os boletos sao adicionados em um jnico arquivo pdf para impressao na grafica.
Se alguem tiver uma opiniao…vai me ajudar bastante
A primeira coisa é fazer a consulta paginada: JPA Consultas e Dicas. Aqui mostra como fazer usando JPA/Hibernate, mas tem como fazer com JDBC puro também.
Outra coisa é gerar vários arquivos menores de PDF. Se você for criar um só com todos os dados, se prepare… vai pesar e muito a memória disponível.
E
entanglement
Se a gráfica insiste em ter apenas um PDF em vez de ter vários, existem alguns programas que juntam vários PDFs em um só. É que as bibliotecas que existem para o Java são notoriamente ruins com PDFs grandes, portanto é melhor gerar vários pequenos.
Procure por “merge pdf”
sergiotaborda
javaCBA:
Oi pessoal
Eu estou fazendo uma aplicação que todo final de mês rodará um serviço de alta complexidade na aplicação. Esse serviço tende a ser pesado porque ele varre uma tabela com mais de 2 milhões de registros.
O que eu quero saber é se alguém sabe alguma forma de realizar esse processamento de forma menos custosa pro server e pro banco?
Eu sei que carregar esses registros, processar…para depois gravar o resultado, mataria meu servidor.
Carregar um por um e fazer isso individualmente também não acho uma boa idéia.
No caso o resultado que eu guardo é em um pdf.
Para simplificar, o cenário seria esse:
Pego uma tabela com diversos tipos de transações…efetuo os calculos e gero boletos. Esses boletos sao todos acumulados em um documento pdf.
Eu quero ideia para processar todos esses milhoes de registros…de forma que se o processamento seja interrompido eu nao perca dados, nem tenha que vlltar do zero. E todos os boletos sao adicionados em um jnico arquivo pdf para impressao na grafica.
Valeu
Existem frameworks como o Spring Batch que podem ajudar você, mas vc precisa encontrar partições nesses dados. ou seja, realmente precisa carregar os 2 milhoes de uma vez só ? Não será que dá para agrupar isso de outra forma ? Esse agrupamento é essencial para que tenha boa performance no batch. Outra coisa essencial é multiprocessamento. Ter vários processadores na mesma máquina ou várias máquinas distribuidas é o ideal. Não sei se o spring batch processa em multi-máquina, mas acho que daria para fazer um pequeno ajuste do tipo master-slave. claro está que para isso vc precisa de várias máquinas. Se ñ poder tê-las, aposte no multi-thread e no particionamento dos dados. Outra coisa que ajuda é ter carregados todos os dados que vc precisar consultar durante o processamento. Estes dados “read only” podem ser partilhados pelas threads se necessário consumindo o minimo de memoria. Lembre-se que a memoria é mais rápida que I/O e hoje em dia é barata também.