criei um aplicativo que lê as informaçções de um arquivo texto e insere numa base de dados MySql, o que ocorre o arquivo de texto tem sempre no minimo 8MB, quando criei o jar do aplicativo e coloquei na maquina do cliente el no meio da inserção fecha repentinamente não dando nem mensagen de erro, achei que era problema da VM e configurei no meu projeto alocando a memoria da VM para minimo 128 e maximo 1024. quando eu rodo a aplicação pelo netbeans ele roda normalmente, agora quando rodo pelo jara acontece isso.
Pode ser que a versão do Java usado no seu cliente seja diferente da versão que você está usando no seu Netbeans.
Se for diferente, desinstale a versão antiga que está no seu cliente, e instale a versão igualzinha à que você está usando no seu NetBeans.
erasmo_tec
verifiquei e as duas maquinas estão com a mesma versão. Java 6 Update 7, tanto na minha maquina quando no cliente…
T
thingol
Hum… é que já vi ocorrer a seguinte situação: quando você executa o seu programa dando um double-click no jar, ele chama uma JRE que não é a que você está esperando, e acaba dando problemas. (se você olhar no Iniciar->Painel de Controle->Adicionar ou Remover Programas, pode ser que você veja que estão instaladas na verdade N versões da JRE, por causa do "auto-update" do Java).
Outra coisa que pode estar ocorrendo é que o tal programa Swing esteja sem alguma biblioteca (.jar) que você sem querer usava no Netbeans e não está copiada no seu cliente. Se isso ocorrer, pode ser que em alguma parte da execução do seu programa, ele tente carregar a biblioteca e, em vez de dar um stack trace, seu programa simplesmente morra.
erasmo_tec
neste caso até poderia ser mas fiz os seguintes teste:
coloquei o jar para rodar na minha maquina e também aconteceu a mesma coisa.
com relação ao java a unica versão instalada é a citada acima não havendo atualizações até o momento
Será que não é algum problema com o bufferedReader que faz a leitura do arquivo?
fantomas
Se vc estiver executando o jar através de um duplo click, ao ocorrer o erro vc não terá tempo de ver a Stack Trace.
Abra uma seção DOS e execute na linha de comando e conta pra nós.
flws
erasmo_tec
eu tenho algum modo de analizar minha JVM em tempo de execução para saber se é estouro de memoria?
B
Bruno_Laturner
No tratamento de exceções ele não insere o ocorrido num log?
erasmo_tec
os erros possiveis eu coloquei para mostrar num JOPtionPane.ShowMessageDialog. tem uma maneira de ao fazer a leitura e quardar no buffer ele ir liberando esse buffer após fazer o insert no banco para não sobregarregar a JVM?
T
thingol
Uma coisa que pode estar ocorrendo é uma exceção em código nativo. Veja se é criado um arquivo com um nome parecido com “hs_err_0123.log” onde “0123” é o pid do processo. Se não estiver achando o arquivo de jeito nenhum, passe o parâmetro -XX:ErrorFile=c:\diretorio\arquivo.log na linha de comando do Java, onde “c:\diretorio\arquivo.log” é o path do arquivo onde será gerada a exceção.
Coloque também para ele imprimir o log na pasta da sua aplicação no HD do usuário.
Quanto a ir liberando o buffer
while ((buffer = ler()) != null)
{
objeto = processar(buffer);
inserir(objeto);
}
sendo que dentro do método de leitura ele cria um buffer com new, ou retorna um null caso não houver mais nada.
fantomas
erasmo_tec:
quando eu rodo a aplicação pelo netbeans ele roda normalmente, agora quando rodo pelo jara acontece isso.
Vc disse que executa o sistema no NetBeans (o engolidor de memória) e o erro não ocorre! :shock: Se isso é verdade então memória é que não pode ser.
O Termino da execução é baseada (por um acaso) em algum tipo de condição?
O arquivo utilizado no teste com NetBeans é o mesmo com o utilizado na execução externa? Pergunta boba mas fiz mesmo assim :lol:
flws
erasmo_tec
os arquivos são os mesmos...
agora o codigo que utilizo na leitura segue abaixo
publicstaticvoidLeia(Stringarquivo)throwsFileNotFoundException,IOException,ClassNotFoundException,SQLException{ConectaBancoconex=newConectaBanco();BufferedReadernaLinha=null;naLinha=newBufferedReader(newFileReader(arquivo));Stringlinha=null;try{sqlDelete="delete from kg_uf";conex.deletar(sqlDelete);while((linha=naLinha.readLine())!=null){String[]l=linha.split(";",-1);cpfCnpj=l[0];contrato=l[1];valorParcela=l[2];nomeDevedor=l[3];uf=l[4];intpos=nomeDevedor.indexOf("'");if(pos!=-1){nomeDevedor=nomeDevedor.substring(pos,pos+1);nomeDevedor="CONSULTAR NOME PELO CPF_CNPJ";}sqlInsert="insert into kg_uf (cpfCnpj,contrato,valorParcela,nomeDevedor,uf) values('"+cpfCnpj+"','"+contrato+"','"+valorParcela+"','"+nomeDevedor+"','"+uf+"')";//Logs.criaLog();conex.inserir(sqlInsert);}naLinha.close();JOptionPane.showMessageDialog(null,"Dados inseridos com sucesso");}catch(IOExceptionerr){JOptionPane.showMessageDialog(null,err);}}
como eu passo esse parametro XX:ErrorFile=c:\diretorio\arquivo.log na linha de comando?
Se essa execução na linha de comando não mostrar nenhuma mensagem no console e nem neste log vou chorar rsrsrsrsr.
flws
fantomas
Então erasmo_tec, o teu código tem umas coisas que chamam minha atenção:
Tem o throws no cabeçalho do método com as seguintes classes:
FileNotFoundException, IOException, ClassNotFoundException, SQLException
O loop que vc montou está sob o domínio de um try catch para IOException, no meu entender se ocorrer uma exception do tipo SQLException (que não é difícil no seu caso) ela será lançada para frente (por causa do throws) e SE neste momento vc não tiver um try cach que envolve a execução do método “Leia” esperto o suficiente para mostrar esta exception vc não irá ve-la mesmo.
Acho que o try catch no método é desnecessário, pelo fato de vc já ter um controle bacana na chamada do método (ESTOU ASSUMINDO ISSO)
Sinto falta do COMMIT / ROLLBACK, o banco está controlando isso automaticamente? Entendi que este processo envolve uma boa quantidade de dados acho que merece uma atenção especial aqui.
Uma variável com esse nome não é uma boa prática parece o número 1 (um) tente evitar isto.
String[]l=linha.split(";",-1);
flws
erasmo_tec
Refiz o projeto novamente e o erro que está acontecendo é um erro nativo do java…
agora como eu posso resolve-lo, não faço a menor idéia de como tratar isso…