Índice do fórum Treinamentos Avançados Treinamento Oracle Tuning - SQL Excesso de Cursores Abertos

Excesso de Cursores Abertos

Dúvidas, dicas e atualizações sobre o Treinamento Oracle Tuning - SQL.

Mensagem Seg Mar 30, 2015 2:20 pm

Mensagens: 0
Bom dia pessoal!

Preciso de ajuda com esse problema, tem dado o erro de Máximo de Cursores abertos excedido.

Eu rodo esse select:
select q.sql_text, count(*)
from v$open_cursor o, v$sql q
where q.hash_value=o.hash_value and o.sid IN (253)
group by q.sql_text
order by 2 desc;


E agora mesmo está mostrando que tem 858 cursores abertos executando a mesma store procedure, que é essa abaixo:

BEGIN PCK_CONFERENCE.P_CHECK_SI_2(:1 , :2 , :3 , :4 , :5 , :6 , :7 , :8 , :9 , :10 , :11 , :12 , :13 , :14 , :15 , :16 ) ; END;

Esse processo é o seguinte: um operador com um coletor de dados faz a conferência dos produtos de uma carga.
Então tem lá umas mil caixas por exemplo de produtos, ele pega o coletor e vai bipando a etiquea de todas as caixas.
Cada caixa que ele bipa, chama essa procedure acima, por isso a mesma procedure é executada milhares de vezes em curto tempo.

É normal os cursores continuarem abertos após a execução da procedure?
Ou os cursores deveriam fechar automaticamente?
Pode ser algum erro na aplicação? Eu nunca vi o código da aplicação, é um projeto Java.
Quem é que fecha o cursor, é o próprio Oracle? Ou depende de um comando no Java pra isso, como um "closeStatement()" por exemplo?

Mensagem Ter Mar 31, 2015 2:53 pm

Mensagens: 0
Pessoal, acho que resolvemos o problema.

Abrimos o projeto Java e colocamos "close" após a execução das procedures.
Rodamos a aplicação, algumas pessoas realizaram o mesmo processo ao mesmo tempo enquanto eu fui monitorando.
Bingo! O número de cursores que atingia o limite (1000) somente com esse processo, dessa vez não passou de 2.

Agora vamos testar por mais alguns dias para conferir se não há efeitos colaterais.

Mensagem Seg Abr 06, 2015 10:01 am
portilho Site Admin

Mensagens: 482
Oi Milton.
No JDBC devem ser fechados os Result Sets e os Statements.

Segue um exemplo:

Statement stmt = conn.createStatement();
try {
ResultSet rs = stmt.executeQuery( "SELECT FULL_NAME FROM EMP" );
try {
while ( rs.next() ) {
System.out.println( "Name: " + rs.getString("FULL_NAME") );
}
} finally {
try { rs.close(); } catch (Exception ignore) { }
}
} finally {
try { stmt.close(); } catch (Exception ignore) { }
}


Note how the finally clause ignores any exception raised by the close():
- If you simply close the ResultSet without the try {} catch {}, it might fail and prevent the Statement being closed
- We want to allow any exception raised in the body of the try to propagate to the caller. If you have a loop over, for example, creating and executing Statements, remember to close each Statement within the loop.

In Java 7, Oracle has introduced the AutoCloseable interface which replaces most of the Java 6 boilerplate with some nice syntactic sugar.


Fonte: http://stackoverflow.com/questions/1219 ... s-exceeded


Voltar para Treinamento Oracle Tuning - SQL

cron