Java, Resolvendo ORA-01000: maximum open cursors exceeded

Achei este texto muito interessante no http://blog.michaelnascimento.com.br. As querys ajudam a debugar sistemas onde ocorrem o famoso ORA-01000 causado por Connections, Statements e ResultSets deixados abertos. Normalmente temos algo como:

Connection con = //obtem conexao;
PreparedStatement ps = con.prepareStatement("SELECT ...");
ResultSet rs = ps.executeQuery();

while (rs.next()) {
   // ...
}

rs.close();
ps.close();
con.close();

texto na integra: Note que eu estou sendo otimista, supondo quePreparedStatements sejam usados ao invés de concatenarStrings para executar consultas e que o método close() nas três instâncias esteja pelo menos no código. Se você não fez nem isso, corra atrás. :-) O bug é que, quando ocorre uma exceção, durante o processamento do select, nenhum dos três objetos é fechado. Então, a primeira solução é colocar o fechamento num bloco try/finally, como mostrado abaixo:

Connection con = null;
PreparedStatement ps = null;
ResultSet rs =null;

try {
   con = //obtem conexao;
   ps = con.prepareStatement("SELECT ...");
   rs = ps.executeQuery();

   while (rs.next()) {
      // ...
   }
} finally {
   if (rs != null) {
      rs.close();
   }

   if (ps != null) {
      ps.close();
   }

   if (con != null) {
      con.close();
   }
}

Tudo certo, né? Errado. Se ocorrer uma exceção ao fechar rsps econ nunca serão fechados. Então a melhor solução seria:

Connection con = null;
PreparedStatement ps = null;
ResultSet rs =null;

try {
   con = //obtem conexao;
   ps = con.prepareStatement("SELECT ...");
   rs = ps.executeQuery();

   while (rs.next()) {
      // ...
   }
} finally {
   if (rs != null) {
      try {
          rs.close();
      } catch (SQLException sqe) {
          // logar excecao
      } catch (RuntimeException re) {
          // logar excecao
      }
   }

   if (ps != null) {
      try {
          ps.close();
      } catch (SQLException sqe) {
          // logar excecao
      } catch (RuntimeException re) {
          // logar excecao
      }
   }

   if (con != null) {
      try {
          con.close();
      } catch (SQLException sqe) {
          // logar excecao
      } catch (RuntimeException re) {
          // logar excecao
      }
   }
}

Ok, você vai me dizer, muito legal isso. Mas meu projeto tem milhares de classes e eu não sei onde eu esqueci de fazer isso. Ou, ainda, eu uso um framework O/RM ou JDBC que deveria resolver este problema pra mim. Bem, nesse caso, você tem como descobrir qual a instrução SQL do(s) cursor(es) que está(ão) abertos. Primeiro, você precisa do SID das sessões abertas pela sua aplicação, que você pode obter assim:

select o.sid, osuser, machine,
count(*) num_curs
from v$open_cursor o, v$session s
where o.sid=s.sid
group by o.sid, osuser, machine
order by num_curs;

Se estiver usando connection pool e um máquina só, pode-se usar estes dados para filtrar os resultados:

select o.sid, osuser, machine,
count(*) num_curs
from v$open_cursor o, v$session s
where o.sid=s.sid and
user_name = 'USUARIO_BANCO' and
machine = 'NOME_MAQUINA_APLICACAO'
group by o.sid, osuser, machine
order by  o.sid;

Utilize os SIDs na seguinte query:

select q.sql_text, count(*)
from v$open_cursor o, v$sql q
where q.hash_value=o.hash_value and o.sid IN (<SIDs>)
group by q.sql_text
order by 2;

Se o framework ou servidor de aplicações que você utiliza faz cache de statements (Hibernate e JBoss fazem, por default), é normal que exista um certo número de cursores com o mesmo SQL em aberto. Suspeite daquelas instruções que tenham um número de cursores muito maior que as outras e investigue de onde elas vêm. E se sua aplicação usa PL/SQL, saiba que as instruções contidas nas suas procedures/functions são contadas individualmente como cursores. Espero ter ajudado 😉


Resolver problema de JAX-WS com Tomcat7 – Erro: javax.xml.ws.WebFault.messageName()Ljava/lang/String;

Ao tentar executar um projeto de webservices com JAX-WS em um Tomcat7 você pode se deparar com  o seguinte erro:

java.lang.NoSuchMethodError: javax.xml.ws.WebFault.messageName()Ljava/lang/String;
at com.sun.xml.ws.model.RuntimeModeler.processExceptions(RuntimeModeler.java:1077

Para resolver este problema, crie uma pasta chamada endorsed na raiz da instalação do seu tomcat7 e adicione a biblioteca webservices-api-x.y.jar (download)

tomcat7-jaxws-300x182

 

 

 

 

 

 


Especificar JRE para executar um ANT – Problema The specified JRE installation does not exist

Hoje tive um problema chato ao tentar executar um Ant em um projeto. O erro The specified JRE installation does not exist era exibido no entanto já havia checado todas as versões de JRE instaladas na minha máquina e configuradas para o eclipse. No entanto faltava uma!

Este erro ocorre quando o JRE especificado na configuração do ANT não existe no sistema.

Para corrigir este erro abra as configurações do ANT conforme figura abaixo, clicando em Run As -> Open External Tools Dialog.

erro-ant1

 

 

Por fim configure a versão da JRE desejada na aba JRE.

config-ant

Simples assim!


Instalando Maven + plugin Eclipse (M2)

1º Instalando Maven

  1. Baixar o maven: http://maven.apache.org/download.html
  2. Descompactar o arquivo.
  3. Adicionar as variáveis de ambiente M2_HOME , M2;
    • M2_HOME = D:\caminho_pasta_maven\apache-maven-x.y.z
    • M2 = %M2_HOME%\bin
  4. Alterar a variável PATH:
    • PATH = acrescentar %M2%
  5. Verificar a existência da variável JAVA_HOME e a referência %JAVA_HOME%\bin no PATH.
  6. Rodar o comando “mvn -version” no cmd.

Em caso de dúvidas visite: http://m2eclipse.sonatype.org/installing-m2eclipse.html

Vídeo ensinando a instalar:

http://www.youtube.com/watch?feature=player_embedded&v=rgSESP1V9c4

 

2º Instalar Plugin M2 no Eclipse

  1. Rode o Eclipse
  2. Va em Menu Help -> Install New Software ->  (botão) Add
  3. Insira a descrição: Maven2Plugin
  4. Insira a url:  http://m2eclipse.sonatype.org/sites/m2e
  5. Se não der certo, dê uma olha da neste site http://m2eclipse.sonatype.org/ e pegue a url correta, ela muda de vez enquando
  6. Clique: OK!
  7. No combo Work With selecione: Maven2Plugin –  http://m2eclipse.sonatype.org/sites/m2e
  8. Aguarde o carregamento da árvore
  9. Selecione o ítem da árvore: Maven Integration
  10. Clique: Next, Next
  11. Leia e Aceite os Termos de Licença
  12. Clique: Finish

 


Problemas de Memória ou lentidão no Eclipse (PermGen Space (Out of Memory) Error)

Essa semana passei por um problema bem chato no Eclipse Indigo (e também no Juno)…. começava a trabalhar e em alguns minutos o eclipse ficava travando/muito lento.

Buscando na Webs identifiquei que o eclipse estava demandando mais memória em máquinas 64bits. Parece que o eclipse tem um bug, pois não sabe passar o limite de memória do arquivo de inicialização dele (eclipse.ini) para o Java. (javaw.exe) e isso estava resultando em um consumo muito alto de memória (as vezes até mais de 1 GB de memória).

Dessa forma, caso você esteja passando por esta situação tente adicionar no mínimo as seguintes configurações no arquivo eclipse.ini (localizado na pasta da sua instalção do eclipse).

-Xms512m
-Xmx1024m
-XX:PermSize=64m
-XX:MaxPermSize=128m

Ps. Podem ser utilizados valores maiores caso necessário.

Um arquivo de exemplo para  inicialização do eclipse.

-startup
plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.0.v20100503
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256m
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m
-XX:MaxPermSize=256m

Obs: Outra dica para quem não está conseguindo resolver o problema de lentidão é verificar o arquivo .log que fica dentro da pasta .metadata seu projeto.  Geralmente este arquivo de log contém o trace dos problemas de memória do seu Eclipse.


Páginas:1234567...18