Pessoal estou com o seguinte problema, tenho o seguinte trecho de código abaixo onde eu recupero as informações de uma procedure minha do Sybase:
boolean results = stmt.execute();
int rowsAffected = 0;
do {
if ( results ) {
ResultSet rs = stmt.getResultSet();
while ( rs.next() ) {
Produto produto = new Produto();
produto.setCodigo( rs.getInt( 1 ) );
produto.setNome( rs.getString( 2 ) );
listaProdutosIndisponiveis.add( produto );
}
rs.close();
}
else {
rowsAffected = stmt.getUpdateCount();
}
results = stmt.getMoreResults();
}
while ( results || ( rowsAffected != -1 ) );
Essa recuperação de dados está sendo um gargalo na nossa aplicação. Está levando em média mais de 10 segundos para recuperar todos os dados retornados pela procedure.
Alguém sabe me dizer como posso otimizar essa recuperação de dados?
Agradeço desde já.
[]'s
Rodrigo
O teu código não faz nada demais…
a procedure roda em quanto tempo no banco?!
quanto tempo leva soh para executar a procedure com a aplicação java?
quantos registros está puxando?
Existe a possibilidade de trazer esses registros por demanda? (Ex: 50 por vez)
não entendi o teu código dentro do Else…
Bom, é meio difícil falar assim por cima… mas eu acho qeu o problema está na procedure, ou no tanto de dados que vc está trazendo.
abraços!
O problema eu acho que é realmente na quantidade de dados recuperados, a procedure é executada em menos de 10ms e retorna mais de 1100 produtos do Sybase.
Eu coloquei logs por toda a aplicação e o trecho onde detectei o gargalo foi nesse loop de recuperação das informações.
Eu gostaria de trazer sim por demanda mais não é uma idéia que eles aceitaram quando propus a algum tempo.
Você sabe alguma outra maneira de recuperar os dados do Sybase que não seja essa que utilizei?
Muito obrigado pela atenção.
[]'s
Rodrigo
talvez não seja a quantidade de 1100 rows retornadas q esteja acocando a app… nem a granularidade do objeto, ja q tu ta populando ele só com 2 atributos vindos da row… tem muitas coisas q devem ser levadas em consideração ai, como o tempo de execução desse SQL direto no banco, e o tempo q ele leva no Java, tipo, coloca um log antes e outro depois desse while (acredito q ja tenha o feito) … tem q ver tb a memória disponível na máquina q ta rodando o Java… bem, pra começo de conversa eu começaria com o seguinte:
log();
while( ... ) {
//recupera os dados
}
log();
Eu fiz isso, coloquei logs em todos os lugares possíveis desse método. E o único lugar que o tempo esta absudamente grande é no trecho do {} while(); o resto está muito rápido.
Eu executei a procedure via banco e via java nos dois casos é muito rápido.
Um coisa que eu achei estranho é que para cada produto que vem do Sybase ele passa 77 vezes no loop do do while antes de encontrar cada registro para recuperar, eu nunca tinha visto esse tipo de coisa, é como se meu result set viesse do sybase com blocos vazios de dados.
Mas quando executo essa procedure no banco os dados vem sem esses blocos vazios.
Acho que eu vou ter que mexer na procedure e tentar arrumar o retorno dela.
O que eu faço hoje em dia é o seguinte, dentro da procedure eu recupero uma lista de produtos e para cada um deles eu executo uma procedure minha que verifica a disponibilidade dele, se estiver indisponível eu retorno ele.
Muito obrigado pela atenção.
[]'s
Rodrigo
77x por objeto recuperado??? Cara isso vai dar mais de 80.000 iterações!!! … bah, confere o retorno desse SQL… ja deu pra ver q o problema não está no código Java… :roll: