Pessoal, assim.
Estou gerando um arquivo texto baseado numa consulta ao banco de dados. Esse arquivo texto é um layout que precismaos enviar para o ministério da saúde.
Porém, como são muitos registros (o arquivo final ficará com cerca de 800KB de texto) a operação não é completada.
O arquivo simplesmente para num ponto e na mensagem de expection simplesmente aparece null. (Estou gerando isso apartir de uma jsp).
Segue trecho do código responsável pela escrita:
while(rsC2.next()){
for(int i=1;i<=20;i++){
wrt.write(rsC2.getString(i));
}
wrt.flush();
Arquivo.novaLinha(wrt);
}
rsC2.close();
rsC2 e o resultset que faz a consulta ao banco, o mesmo possui 20 campos.
e wrt é um objeto do tipo Writer que “escreve” no arquivo.
o java possui algum limite máximo para geração de arquivos ou algo assim?
De maneira alguma, o que pode estar acontecendo é que simplesmente o final do ResultSet é atingido. Uma dica: chame o flush somente após escrever tudo o que você precisa.
Inicialmente eu estava fazendo assim, porém eu tentei chamar o flush a cada linha para ver se mudava alguma coisa.
E o fim do resultSet não deveria ser o fim de todos os registros?
Pergunto isso porque esse trecho está caindo na Exception, no meio do processo. A query retorna aprox 2500 linhas e esse erro ocorre por volta da linha 800.
E o mais estranho é que o getMessage da Exception retorna null.
Apenas mais um detalhe.
Limitei o SELECT (que é feito em base ORACLE) para retornar somente 350 linhas.
Aí funcionou perfeitamente.
Os ResultSets tem um limite máximo de registros?
Pessoal estive procurando a respeito e não encontrei nada referente aos ResultSets terem um limite de registros.
Alguém saberia me informar se há algo assim?
Porque como disse antes, limitei o numero de linhas apenas para teste. Porém eu preciso trabalhar com todos esses dados juntos, de forma a gerar um arquivo txt com os mesmos.
Se alguém souber aí, da uma força.
Vlw.
Sugestões:
- Tentar encontrar um padrão, verificar se sempre está parando no mesmo ponto (você já citou que é aproximadamente na linha 800);
- Se sim, verificar se não tem nenhum valor inválido em algum campo;
Uma das possibilidades é de que o campo está com valor NULL (dirty), na primeira ocorrência está causando exception no write (que causa NullpointerException porém o getMessage = null)
String campo;
while(rsC2.next()){
for(int i=1;i<=20;i++){
campo = rsC2.getString(i);
if(campo != null)
wrt.write(campo);
else
wrt.write("*** valor NULL ***"); // ou o que achar melhor
}
wrt.flush();
Arquivo.novaLinha(wrt);
}
rsC2.close();
Cara, era isso aew msm.
Um campo estava vindo como null.
Vlw pela idéia.
Até, abraço.