Estou com um sério problema de performance na minha aplicação, tenho um array em média com 20000 registros, para cada, existem várias verificações, algumas vem simplesmente do banco de dados, outras de webservices (que estão em rede local e rodam relativamente bem), já tentei melhorar todo o código, usando mapas para algumas coisas que sei que se repetirão ao longo dessa iteração, commit atomico (ejb) e tunning das querys, o que gostaria de saber é, se alguem já teve alguma experiencia positiva, dividindo o array e colocando ele para rodar em threads diferentes ou se alguem tem alguma idéia de como melhorar isso.
estou usando o OC4J e não tem como mudar isso, o que não ajuda muito.
se vc puder dividir os dados em varias threads com certeza vai melhorar a performance. não sei se vai ficar 100% mas dar uma boa melhorada.
mas teria que dividir por igual e criando as varias threads.
Você já usou um profiler para ver onde está o gargalo da sua aplicação?
Ou ainda está chutando?[/quote]
olá ViniGodoy,
já verificamos sim, inclusive na aplicação e no banco, e é justamente aí que mora o problema, não há uma etapa do processo que ‘trave’ tudo, é o conjunto de verificações + cache em memória que com o decorrer do processo derruba a aplicação. não colocamos na máquina de produção (um monstro) para testar o desempenho, mas as máquinas de desenvolvimento deveriam ser boas o suficiente para aguentar isso.
se vc puder dividir os dados em varias threads com certeza vai melhorar a performance. não sei se vai ficar 100% mas dar uma boa melhorada.
mas teria que dividir por igual e criando as varias threads.
não custa fazer esse teste.[/quote]
estou tentando fazer isso agora mesmo, quebrando a massa de dados para ser processada em diferentes threads, mas ainda assim espero encontrar ter mais alguma idéia que possa me ajudar a melhorar a performance ainda mais.
Outra coisa… 20.000 registros não costuma a ser muita coisa. Ou sua aplicação é muito matemática (e cada registro contém informação muito densa), ou existe sim alguma coisa muito errada em algum ponto do seu código.
Mas é normal. Muitas vezes é mais difícil achar onde, do que efetivamente corrigir o problema.
[quote=ViniGodoy]Seu problema é lentidão ou instabilidade?
Outra coisa… 20.000 registros não costuma a ser muita coisa. Ou sua aplicação é muito matemática (e cada registro contém informação muito densa), ou existe sim alguma coisa muito errada em algum ponto do seu código.
Mas é normal. Muitas vezes é mais difícil achar onde, do que efetivamente corrigir o problema.[/quote]
o problema é performance, o sistema começa rodando bem e conforme vai lendo os registros, vai decaindo a performance gradativamente.
Já verificaste o pool de conexão se não está deixando conexoes abertas ou abrindo conexoes demais no decorrer?
Cara, como falaram ai em cima, a probabilidade de ser alguma coisa errada passando despercebido e não o código em si, é muito grande. Geralmente é uma cagada que por mais primaria que seja o cara não vê. Se puder, mande outro desenvolvedor que não teve contato com o código para dar uma olhada. As vezes o cara chega sem vicio no código.
da uma olhada no codigo
tenta retirar lixo que não é preciso
elimita as contatenações de strings
utiliza stringbuilder
retira System.out.print caso se tiver usando
alguns ajustes destes mesmo parecendo ajustes bobos ajudam na perfornance da aplicação.
pode melhorar tb um pouco.
bem, já que vc tem tantas formas diferentes de verificações, aconselho uma coisa: agrupa essas verificações
Assim vc ganha algumas coisas:
ganha na utilização de recursos, já que qndo vc começar a acessar o banco, vai poder usar efetivamente um cache, mesma coisa para WS;
ganha na análise de performance, já que assim vc vai ter como ver aonde está o gargalo, se é no banco, se é no WS, se é em memória;
ganha na legibilidade, já que o código vai ficar mais modular
depois de feito isso, e analisado os dados, dai vc pode sim dividir para conquistar
e eu te aconselho a agrupar essas threads de forma correta, para que elas não disputem muitos recursos ao mesmo tempo, senão vc perde performance com lock