Processamento + performance + integridade

3 respostas
J

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.

Se alguem tiver uma opiniao…vai me ajudar bastante

Valeu

3 Respostas

Hebert_Coelho

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

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.

Criado 9 de dezembro de 2012
Ultima resposta 10 de dez. de 2012
Respostas 3
Participantes 4