Bom dia pessoal, estou com um problema numa aplicação web, onde estou tendo que fazer atualização em 79000 registros. Estava fazendo essas atualizações uma a uma através de uma iteração de uma coleção. Porém estava muito lento, demorando em média 10min ou mais. Tentei então fazer atualizações em batch, ou seja, a cada 1000 updates armazenados no lote, eu mandava executar o batch. Continuava lento. Fui diminuindo e aumentando o tamanho do lote, até conseguir o máximo de performance com 150 updates por lote, levando em média 4min. Esse tempo ainda é muito grande para o usuário. Alguém tem alguma idéia de como eu poderia ganhar performance com essas atualizações? Seria possível, usar uma thread que faça essa atualização em batch e o usuário continuar usando outros módulos da aplicação?
Olá,
É possível fazer com Threads sim, mas não é recomendado.
Eu mesma tinha várias Threads com acesso a BD em uma aplicação web, e quando fomos colocá-la em um Servidor de Aplicação com uso de DataSource, o servidor “reclamou”… parece que não é adequado startar threads pela aplicação, de acordo com as especificações J2EE (pesquise mais sobre o assunto).
Por isso, precisamos “repartir” a aplicação, e para a parte de processamento criamos MDBs (Message Driven Beans), em um projeto EJB, e a parte de telas ficou em outro projeto Web.
A parte Web coloca instâncias em uma fila JMS que dispara o processamento do MDB. Os MDBs são asincronos.
Os MDBs parecem ser a melhor opção para ser usada no lugar de threads.
Nas situações similares a sua, o processamento é feito em paralelo e eu aviso o usuário para aguardar e-mail sobre a finalização do processamento, e o usuário continua trabalhando no sistema…
Atenciosamente,
Fernanda
N
nolimits
Oi fernanda, sua idéia parece ser muito legal. Esse “Message Driven Beans”, funciona como threads? Porque a idéia que tive é que o usuário acione o botão gravar, que faz alguns cálculos matemáticos na minha aplicação e começa a dar os updates. Estava utilizando batch, mas a quantidade de registros é muito grande 79000, e ainda ficou muito lento e o sistema expirava a sessão dando time-out. A idéia que estava tendo era acionar uma thread ou alguma coisa que começasse o processamento, gravasse os dados, o usuário pudesse ir para outra tela e quando o processamento acabasse, na outra tela ele recebesse uma mensagem informando que o processamento na tela anterior havia acabado. Isso é possível?