Vida Util de Runnable

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);
                }
            }
    }

}

Não. É só o método “run” que sai, e a thread que acaba; o objeto continua vivo.

[code]
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);
                }
            }
    }

}[/code]

E como posso matar esse objeto???

Você conhece alguma forma???

Obrigado!

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.

suas Threads criam varias conexoes no banco antes de fechar as anteriores?? tem banco q tem limite max de conexoes…mySQL por exemplo.

“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

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

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…

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

:?:

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…

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…