Multithread

E ai galera blz? Estou com um problema um pouco complexo. Preciso realizar um processo de transformação de dados o famoso ETL. Porém o banco de dados é bem grande e as tabelas contem muitos dados. Resumindo, estou desenvolvendo uma aplicação que busca os dados de um banco de dados e carregando no mysql. As consultas estão bem otimizadas e muito rápidas, a demora está no processamento dos dados para gerar o INSERT para o novo banco. A solução que pretendo aplicar é a seguinte: Abrir o máximo de threads que a máquina suportar de forma que cada thread faça o processamento de uma tabela, que é buscar os dados e montar o INSERT e se necessário criar a tabela no banco. Todo o algoritmo já está pronto porém só falta esta questão para agilizar o meu processo na execução da aplicação, abrir múltiplas threads. O Processador é um QuadCore HT então aguenta bastante pressão, so que quero verificar se não estou sobrecarregando a máquina com tarefas, e sempre verificar se o processamento da máquina está atingindo 90% por exemplo. Conseguindo isto eu acredito que resolvo o meu problema. Galera espero que tenha conseguindo expressar o meu problema.

Cara, tenho uma sugestão pra você.

Você pode fazer a consulta e carregar seu resultset de alguma forma que suas threads consigam acessar. Olha o codigo que eu vou colocar aqui não é dos mais belos mas nesse editor do guj e respondendo o forum é o que da pra fazer hehehe

ResultSet rs = DAO.getResultados();

for(int i=0;i<10;i++){
   new MinhaClasseDeThreads(rs).start();
}

nesse exemplo ai vc viu que eu subi 10 threads passando o rs como parametro, agora vamos a implementação do MinhaClassDeThreads

public class MinhaClasseDeThreads extends Thread{
    private ResultSet rs;

   MinhaClasseDeThreads (ResultSet rs){
      this.rs = rs;
   }

   public void run(){
         while(rs.next()){
                   //pego dados do rs e insiro em qualquer lugar do mundo
         }
   }
}

logico que nao é o codigo mais lindo do mundo cheio de padroes mas para insert de grandes massas de dados que vc precisa ler de um lado e inserir no outro funciona, afinal vc nao carrega tudo na memória de uma vez para depois descarregar.

Agora, se vc quiser fazer implementações via JPA, Spring, patterns de todos os gostos ou etc é com vc hehehe.

Existem maneiras mais elegantes de se trabalhar com pool de threads também, de uma olhada em http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

Falow!

Assim, pra mim não ficou claro onde é o gargalo, se é no processamento dos dados ou se é no envio dos comandos para o banco. De qualquer maneira, se você enviar tudo através de um único Statement provavelmente vai gerar um gargalo. E mais ainda, se múltiplas threads tentarem modificar a mesma tabela você também vai ter gargalo, porque o próprio SGBD sincroniza o acesso a tabelas para modificação. Um outro ponto a considerar, é que não há garantia alguma de que o SO disponibilize mais de um núcleo para as threads da JVM, talvez você tenha que ir mais a fundo e lançar as threads como processos separados de fato.

O gargalo é no processamento, lá é que agarra! Eu não vou processar as mesmas tabelas ao mesmo tempo, e sim uma de cada vez, ou seja… cada thread irá trabalhar somente com uma tabela,no controle de concorrência não irei concorrer ao mesmo tempo com a mesma tabela no banco. Mas agora você me pôs a pensar, pois se SO não disponibilizar mais de um nucleo para as threads na JVM ai não resolve o meu problema. Seria interessante lançar então como processos separados. Onde encontro um melhor pratica para isto?

E ai marcelux, obrigado pela dica. Acredito que vai ajudar, agora estou somente com dúvida com relação ao que o mendes08 falou que é a questão da disponibilidade de nucleos que o sistema operacional irá disponibilizar a JVM.