Desenvolvi um sistema de acessa a uma base da dados DB2… Nela existem 2 Theads do tipo Runnable que criam um Statement e alguns ResultSets em cada uma, depois de algum tempo rodando a aplicação aparece que excedeu o limite de Statements para conexão com o banco de dados.
Bem mas pelo que sei ao final do método Run(), tudo que existe na classe que implementa a Runnable morre(sai da memória), estou correto???
publicvoidrun(){try{.....instruções}catch(SQLExceptionex){System.out.println("HOUVE UM ERRO");}finally{try{if(r1!=null){r1.close();}if(r2!=null){r2.close();}st.close();}catch(SQLExceptionex){Logger.getLogger(CremerTXTVisView.class.getName()).log(Level.SEVERE,null,ex);}}}
Bem mas pelo que sei ao final do método Run(), tudo que existe na classe que implementa a Runnable morre(sai da memória), estou correto???
Não. É só o método "run" que sai, e a thread que acaba; o objeto continua vivo.
staticclassVerificaNFimplementsRunnable{Statementst=conexao.getStatement();ResultSetr1=null;ResultSetr2=null;publicvoidrun(){try{.....instruções}catch(SQLExceptionex){System.out.println("HOUVE UM ERRO");}finally{try{if(r1!=null){r1.close();}if(r2!=null){r2.close();}st.close();}catch(SQLExceptionex){Logger.getLogger(CremerTXTVisView.class.getName()).log(Level.SEVERE,null,ex);}}}}
J
j.francisco.br
E como posso matar esse objeto???
Você conhece alguma forma???
Obrigado!
T
thingol
Não mate o objeto. Feche os resultsets e statements, e então sete as variáveis de instância (só vi st, r1 e r2, mas deve haver mais) para null.
agostinho
suas Threads criam varias conexoes no banco antes de fechar as anteriores?? tem banco q tem limite max de conexoes…mySQL por exemplo.
J
j.francisco.br
“agostinho”,
A cada a Thread cria uma nova conexão e resultsets, ao final eu apenas as fechava com um .close()… estou agora testando a sugestão do “thingol”, espero que funcione!
flw
J
j.francisco.br
Não Funcionou…
Na classe principal eu tenho um timer, que de tempo em tempo ele cria uma nova Threader assim :
// INICIO DA THREADER DE VERIFICACAORunnablerunnable=newVerificaNF();newThread(runnable).start();
Se que eu to errando na chamada da threader??? tem como matar tudo que tem nessa threader ao final da execução???
agostinho
depois q a thread terminar de executar, os objetos que nao estiverem mais ativos (apontando p/ Null) vao ser marcados p/ coleta de lixo e serão limpos, mas quem decide isso eh o GC, vc n tem acesso direto a ele diretamente. cara, vc n acha q eh o limite de conexoes com o banco q ta estourando? seu banco de dados suporta Sei_La_Quantas_Conexoes_Simultaneamente?? pelo q entendi, vc ta abrindo varias conexoes…e talvez elas nao estejam sendo fechadas…
J
j.francisco.br
Na teoria eu to fechando elas no final de execução da Threader…
if(st!=null){
st.close();st=null;}
st = null; // pra garantir
Mas quanto tempo ela fica no GC??? A proposito o que é GC??
:?:
agostinho
Garbage Collector. eh o coletor de lixo…ele tem um algoritmo interno q varre a memoria p/ limpar os objetos q nao referenciam nada…q banco vc usa?? aumente o numero de conexoes simultaneas permitidas no banco de dados e veja se dá certo…
J
j.francisco.br
Eu to usando o banco DB2, eu fecho a conexao e mesmo assim me retorna a mensagem, o problema é que dai eu tenho que fechar a aplicação para conseguir conectar denovo, a aplicação não consegue mais reconectar com o Banco de Dados…