[Resolvido]Estourando Maximo Cursores Oracle

5 respostas
Hellmanss

Segue um exemplo do que imagino estar acontecendo:

PreparedStatement stmt;

try{
    //faz o primeiro Statement
    stmt = minhaConexao(....);
     //....
    stmt.execute(...);
  /....

    //faz outros statemens....
  stmt = minhaConexao(...);
  /...
   stmt.execute(...);

//faz outros statements...............


}catch(Exception e){
    //....

//Finaliza statement
}finally{
   if(stmt != null){
       stmt.close();
  }
}

Minha duvida é:
o CLOSE do statement no bloco Finnaly vai fechar todos cursores, ou apenas o ultimo?

Tenho que a cada reuso do statement fecha-lo primeiro?

Antes de mais nada… não testei fechar todos os statements a cada uso por causa do numero muito grande de ocorrencia na aplicação. Demoraria muito para fazer esse teste, podendo significar perda de tempo :smiley:

[size=18]Resolvido, foi apenas fechar todos statments a cada uso que melhorou![/size]

5 Respostas

eltonads

Só fecha o ultimo. Você tem que fechar um por um.

KWill

Nesse caso aí em cima, para mim você não está reaproveitado objetos do tipo “PreparedStatement” de forma alguma, no máximo está apenas reciclando a mesma variável de referência para os objetos do tipo “PreparedStatment” que você vai criando até que o limite de cursores abertos do Oracle estoure.

Inté.

Hellmanss

É o que estou suspeitando =X

Digamos que, a nível Java o objeto é reaproveitado, mas a níve Oracle acho que não…

:roll:

KWill

Hellmanss:
É o que estou suspeitando =X

Digamos que, a nível Java o objeto é reaproveitado, mas a níve Oracle acho que não…

:roll:


Repito, você só está reaproveitando a variável que é a referência ao objeto, esse método “minhaConexão(…)” deve estar chamando o método “prepareStatement(…)” da classe “Connection” e eu continuo sem ver qualquer reaproveitamento de objetos nesse código acima.
Tente compreender que essa variável “stmt” é apenas uma referência a um objeto do tipo “PreparedStatement” e toda vez que você coloca “stmt = minhaConexao(…);”, essa variável “stmt” recebe outro valor de referência a um objeto do tipo “PreparedStatement”.

Inté.

Hellmanss

KWill:
Tente compreender que essa variável “stmt” é apenas uma referência a um objeto do tipo “PreparedStatement” e toda vez que você coloca “stmt = minhaConexao(…);”, essa variável “stmt” recebe outro valor de referência a um objeto do tipo “PreparedStatement”.
.

Ok, entendi.

Ja fiz as alterações aqui, e assim que rodar a rotina volto pra dizer se houve melhoras.

Obrigado :smiley:

Criado 15 de maio de 2009
Ultima resposta 15 de mai. de 2009
Respostas 5
Participantes 3