Vida Util de Runnable

10 respostas
J

Olá Pessoal,

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???

Ex (classe extendida runnable):

static class VerificaNF implements Runnable {

Statement st = conexao.getStatement();

ResultSet r1 = null;

ResultSet r2 = null;
public void run() {
   try {
     ..... instruções
   } catch (SQLException ex) {
           System.out.println("HOUVE UM ERRO");
   } finally {
           try {
               if (r1 != null) {
                      r1.close();
                }
                if (r2 != null) {
                        r2.close();
                }

                st.close();
                } catch (SQLException ex) {
                    Logger.getLogger(CremerTXTVisView.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
    }

}

10 Respostas

T
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.

static class VerificaNF implements Runnable {
    Statement st = conexao.getStatement();
    ResultSet r1 = null;
    ResultSet r2 = null;

    public void run() {
       try {
         ..... instruções
       } catch (SQLException ex) {
               System.out.println("HOUVE UM ERRO");
       } finally {
               try {
                   if (r1 != null) {
                          r1.close();
                    }
                    if (r2 != null) {
                            r2.close();
                    }

                    st.close();
                    } catch (SQLException ex) {
                        Logger.getLogger(CremerTXTVisView.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
        }
   }
J

E como posso matar esse objeto???

Você conhece alguma forma???

Obrigado!

T

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

“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

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 VERIFICACAO
    Runnable runnable = new VerificaNF();
    new Thread(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

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

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…

Criado 3 de setembro de 2008
Ultima resposta 5 de set. de 2008
Respostas 10
Participantes 3