Blog do TaQ

Cursores no Oracle

Publicado em Developer

Já falei algumas vezes por aqui que eu trabalho no Expresso Itamarati, uma empresa de transporte de passageiros do interior de São Paulo, que inclusive foi alvo de aquisição recente. Pois bem, aqui temos um sistema de venda online e, me desculpem os puristas dos milisegundos, realtime de venda de passagens, desenvolvido todo por mim, em Java (haviam planos para Rails esse ano, vamos ver).

Acreditem, tem duas aplicações "servidoras" desse sistema em um PIII com 256Mb com um monte de gente conectada nele, e não está lento! A lentidão reside no jeito que se faz as coisas, certo? ;-)

Pois bem, no último feriadão, na Páscoa, tivemos aquele medo geral da turma em relação aos problemas com o setor aéreo, e, resultado, uma boa parte viajou de carro ou de ônibus, o que foi interessante para nós aqui. Só que notei um comportamento estranho do sistema devido ao número muito maior de acessos (tanto no sistema em si como o site da empresa), e tive que investigar para ver o que estava acontecendo.

A causa era que o número de cursores do Oracle, que é o banco que utilizamos na aplicação, foi "estourado", providenciando várias mensagens simpáticas de erro nos logs dos servidores da aplicação (ah, vale uma observação: essa aplicação não é J2EE). Para evitar que isso se repita, decidi monitorar o número de cursores abertos e verificar se eles se aproximam do valor máximo (que já duplicamos depois dessa experiência).

Trocando uma idéia com o DBA aqui chegamos na seguinte consulta:

select abertos, maximo, round(100/(maximo/abertos),2) as porcentagem from 
(select count(*) as abertos from v$open_cursor),
(select value as maximo from v$parameter where name= 'open_cursors')

Essa consulta retorna o número máximo de cursores alocados na configuração do banco e quantos estão em uso. Coloquei uma thread no sistema para verificar regularmente se tem algum limite chegando, e se tiver, liberar alguns recursos do sistema, deixando o banco de dados feliz e tudo funcionando, somente com algum "pipoco" rápido para o nosso usuário.

Agora o engraçado foi detalhar essa solução para um gerente (ei, sou gerente também!):

Eu: _E com isso vamos ter monitoramento que vai evitar mal-funcionamento, deixando o sistema um pouco instável por muito pouco tempo mas garantindo que a carga vai ficar normal em situações de muitos acessos ...
Gerente: _Instável por quanto tempo?
Eu: _Um minuto, menos, por aí.
Gerente: Ah, não sei não hein, acho que vai ficar complicado ...

Aquele negócio né: dá a mão, quer o braço. ;-)


Tags:


Comentários

comments powered by Disqus

Twitter