Timeout do andamento do resultset

Bom dia pessoal,

Estou com um pequeno problema num resultset

Ele puxa os dados e começa a carregar isto num arquivo, o problema que chega um determinado tempo ele congela e não anda mais, para de carregar o texto e fica travado.

A consulta é um pouco pesada, mas ela abre normalmente, o problema esta quando fico no while desse resultset carregando o texto

Existe alguma solução para isto? Um querytimeout para resultset talvez?

Obrigado turma :slight_smile:

Abraços

http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#setQueryTimeout(int)

Mudar o valor do timeout pode resolver o problema a curto prazo, mas vc poderá ter a mesma coisa caso a pesquisa fique ainda maior.
Tente repensar a tua solução.

Mas ai que ta, a consulta não tem problema, é executada normal

O problema esta quando começo a carregar o txt que eu estou criando.

Olhe por exemplo 1 código:

num_campos = rs.getMetaData().getColumnCount(); while(rs.next()) { valor = rs.getString(1); if(valor==null) { continue; } sbLinha = new StringBuilder(valor); for(i=2;i<=num_campos;i++) { valor = rs.getString(i); if(Utilitario.Existe(lista_campos, i)) { sbLinha.append("\t").append(Utilitario.ConverteUnixtimeDateTime(valor)); } else { if(valor==null) { valor = " "; } else { pt = Utilitario.Existe(lista_tam, i); if(pt>-1) { if(valor.length()>lista_tam[pt][1]) { valor = valor.substring(0,lista_tam[pt][1]); } } valor = valor.replaceAll("\t", " "); valor = valor.replaceAll("\r", " "); valor = valor.replaceAll("\n", " "); if(Utilitario.Existe(lista_campos_num,i)) { valor = Utilitario.VerificaValor(valor); } } sbLinha.append("\t").append(valor); } } sbLinha.append("\r\n"); bw.write(sbLinha.toString()); }

Num certo nomento o while trava e não vai pro proximo registro. ( trava no rs.next());

Att

Onde o seu debug parou?

exatamente no rs.next() do while

-Depois de quanto tempo o sistema trava? Vc tem dois IO a cada loop: uma chamada ao DB e outra ao arquivo.
-Quantos registros vc espera ter? -> Tente escrever o arquivo em blocos de X linhas.

algumas dicas:

limpa seu stringbuilder ao inves de criar um new StringBuilder a cada iteração… cada new em um objeto consome memoria mesmo com a jvm excluindo objetos sem referencia…

usa o newLine do bufferedwriter ao invés de usar sbLinha.append("\r\n")

faz isso: for(i=2;i<=num_campos;i++)
logo no começo… com o valor de i = 0… e se for zero q vc nao quiser nada com a coluna 0; da um continue… desse modo, vc testa se o valor do campo == null em todos os campos

tenta quebrar o arquivo de texto depois de X linhas… pra ver se ele ta gravando certinho e tal… e vai liberando aos poucos pra ver q exata linha e resultSet ele trava… se estiver com pressa de encontrar a solução, divida o arquivo depois de X linhas… assim se o texto ficar muito longe, gera vários arquivos

tveronezi o pior é que ele nao tem uma regra, a ultima vez travou com meados de 300k de .txt

Não tem um tempo ou quantidade, é aleatorio.

redr4gon valeu as dicas isso melhora o codigo mas esta realmente travando no rs.next