Problema com desempenho

Pessoal

estou com um problema em fazer um “de para”

faço uma importação de 7.000 registros para uma tabela temporaria

depois abro um looping percorrendo esses registros fazendo verificações com os dados que já existem…

tipo assim

if(resultSet1.nex()){
faz algo
}else{
faz outro algo
}

faço cerca de 6 verificações como essa dentro deste looping…

O meu processamento vai la pra cima… e trava tudo… já aumentei a memória do tomcat para 512MB e mesmo assim não adiantou…

O que posso fazer…

Obrigado

haa mais uma coisa…

nessas verificações (faz algo) eu faço insert em tabelas diferentes

vc já pensou em resolver isso via stored procedures?

vc precisa deste 7000 registro de uma so vez!

abre transações e commita de x em x registros
ou então resolve tudo no banco mesmo, como foi dito. (store procedure)

se você mostrasse o código, ficaria mais fácil de ajudar

agora, você insere os registros em uma tabela temporária e depois só pecorre ela? num daria no mesmo tratar no resultset mesmo?

se nao puder tratar no proprio banco
tenta limitar o resultado
tipo uma paginação de 100 em 100 por exemplo
pq o que trava é carregar 7000 registros de um vez so

Dependendo do tamanho do registro, 7000 não é uma grande quantidade não…

Pode colocar o código aqui?

Se você faz questão de resolver isso via Java, use a paginação como o joca_java falou
Evite criar DTO, VO, etc e use o update em modo batch
Exemplo

try {
dbCon.setAutoCommit(false);

Statement stmt= dbCon.createStatement();
stmt.addBatch("INSERT INTO bugs "+ 
"VALUES (1007, 'Server stack overflow', 1,2,{d '1999-01-01'})");
stmt.addBatch("INSERT INTO bugs "+ 
"VALUES (1008,'Cannot load DLL', 3,1,{d '1999-01-01'})");
stmt.addBatch("INSERT INTO bugs "+ 
"VALUES (1009,'Applet locks up',2,2,{d '1999-01-01'})");

int[] updCnt = stmt.executeBatch();
dbCon.commit();

Blz pessoal obrigado pelas dicas… vou postar a lógica do código aqui.

obs. Estes 7.000 registros são gerados do ERP SAP e eu não entendo o porque de tantas verificações a serem feitas maissss, bom eles tinham isso desenvolvido em php utilizando SCRIPTCASE e agora estou migrando pra java.

detalhe( o que tem em php foi completamente modificado na versão que esta sendo feito em java )

Se eu faço a importação do arquivo sem utilizar transação eu dou a carga que for que não consome nada de memória só o processamento que vai la prá cima mais até ai blz.

O que está me ferrando é importar de 7.000 a 11.000 registros e no lopping da importação eu abrir consultas de verificações e fazer inserts.

Eu gostaria de aprender como é alocado isso na memória, pois a cada looping que é feito eu tenho lá os SQL’s com suas clausulas WHERE’s e estes me retorna um ResultSet e quando eu faço la if(resultSet.next()){} como fica isso na memória… Ele vai alocando na memória um resultSet em cada looping?

Se tiverem algum material para me passar agradeço.

Segue a lógica

// Depois de importado os registros para uma tabela temporaria 'gmd_razao' do banco de dados SQL SERVER é feito as seguintes verificações:


public static final String EXISTEM_REGISTROS = "SELECT * FROM gmd_razao";

PreparedStatement stmt = this.connection.prepareStatement(EXISTEM_REGISTROS);
ResultSet rs = stmt.executeQuery();

//percorro a tabela gmd_razao
while(rs.next()){

consulta1 (Select conta_contabil From gmd_contabil where conta_contabil = ?) // este parametro vem da tabela gmd_razao
consulta2 (Select conta_contabil From gmd_excecao where conta_contabil = ?) // este parametro vem da tabela gmd_razao
consulta3 (Select ccusto_analitico From gmd_excecao1 where ccusto_analitico = ?) // este parametro vem da tabela gmd_razao
consulta4 (Select conta_contabil From gmd_contabil where = conta_contabil = ?) // este parametro vem da tabela gmd_razao
   
//agora verifico
if(consulta1.next()){

  if(consulta2.next()){   

            inserir1 (Instruções SQL para inserir os dados que estão vindo da tabela temporária)
  
   }else{

     if(consulta3.next()){

        inserir2 (Instruções SQL para inserir os dados que estão vindo da tabela temporária)

     }else{
        
            if(consulta4.next()){

                 if(consulta5.next(){
                     inserir3 (Instruções SQL para inserir os dados que estão vindo da tabela temporária)
                 
                 }else{
                     inserir4 (Instruções SQL para inserir os dados que estão vindo da tabela temporária)
                 }

            }else{

                    inserir5 (Instruções SQL para inserir os dados que estão vindo da tabela temporária)
            }
     }
   }
}

É mais ou menos isso ai pessoal de acordo com as exigências vou criando mais verificações…

Estava pensando em trabalhar com exceções utilizando try{}catch(){}…quando cair na exçeção ele faz a devida insert… ao invés de abrir vários if…

O que acham???

Obrigado pessoal