Pool Connection: Cannot get a connection, pool error Timeout waiting for idle object

Bom dia Pessoal. Preciso de uma Ajuda da Comunidade.

A vários meses tenho um problema referente Pool de Conexão: Tomcat 6.0 + Oracle 10g. Pelo menos três ao dia o Tomcat apresenta a seguinte mensagem:

Pool Connection: Cannot get a connection, pool error Timeout waiting for idle object

Neste caso, sou obrigado a reiniciar o TOMCAT. Já revisei as classes e todas as conexões são abertas e fechadas.

Meu context.xml está configurado da seguinte maneira:

<Context>

<Resource
name="jdbc/bdzen"
type="javax.sql.DataSource"
username="USUÁRIO DO BANCO"
password="SENHA DO BANCO"
driverClassName="oracle.jdbc.OracleDriver"          
url="jdbc:oracle:thin:@192.168.4.10:1521:f3ipro"
maxActive="30"
maxIdle="8"
maxWait="6000"/>

</Context>

EXEMPLO DE MÉTODO:


 public Vector leMontadoras() {
    Connection con         = null;
    PreparedStatement stmt = null;
    ResultSet rs           = null;
    Vector v = new Vector();
    try {
      [b]con  = BDPoolConexaoZen.conectar();[/b]
      String sql = "select codigo, descricao from cat_montadora order by descricao";
      stmt = con.prepareStatement(sql);
      rs   = stmt.executeQuery(sql);
      while (rs.next()) {
        v.add(rs.getString(1));
        v.add(rs.getString(2));
      }
    } catch (Exception e) {
      System.err.println("Erro Repositorio.leMontadoras..."+e.getMessage());
    } finally {
      try { if (rs != null)    { rs.close(); }}  catch (SQLException e) { }
      try { if (stmt != null)  { stmt.close();}} catch (SQLException e) { }
[b]  try { if (con != null)   { con.close();}}  catch (SQLException e) { }[/b]
    }
    return v;
  }

EXEMPLO DO MÉTODO POOL CONEXAO:

public class BDPoolConexaoZen {

  public BDPoolConexaoZen() { }

  public static Connection conectar() {
    PreparedStatement stmt  = null;
    try {
      Context initContext = new InitialContext();
      Context envContext  = (Context)initContext.lookup("java:/comp/env");
      DataSource  ds = (DataSource)envContext.lookup("jdbc/bdzen");
      Connection con =  ds.getConnection();

      return con;
    } catch(Exception e) {
      System.err.println("Erro ao Conectar no Pool Connection: "+e.getMessage());
    }
    return null;
  }

Conto com a Ajuda de Todos.

Abraços e Obrigado

Renato

Isso é erro que indica q todas as conexões estão bloqueadas…vc tem certeza que esta liberando mesmo? kkkkkkkk
Outra coisa 30 conexões? Quantos sessões por minuto essa app ai atende?

Obrigado pelo retorno. Já conferi as classes e todas fecham a
Conexão. Já aumentei de 30 para 400 e o problema
Persistiu. Nao tenho mais de 300 conexões por minuto simultânea.

Abs

Renato

Complicado…vc disse q fechando certinho mas sua aplicação ta precisando de mais conexões?? como fica?
Alguem ta segurando a connection e não esta devolvendo…por isso o problema persistiu…aumentar não vai adiantar…só vai remediar…
Se vc ta garantido q seu código esta ok, vou tentar de dar umas dicas, em cima disso:

  1. O que bloquea conexão tb é DEAD-LOCK no banco…
    Faz assim…quanto tudo travar…veja no banco se tem LOCK…caso tiver, o banco de dados vai encavalar as conexões por cima umas das outras, caso a proxima leia as tabelas envolvidas no LOCK.

  2. Vc ta usando um pratica ruim q gasta conexões…vc esta lendo o ResultSet que bloquea a conexão na interação…Aconselho vc a colocar os dados numa CachedRowSet, liberar a conexões e depois vc itera para pegar os dados.

Não gerencie esse tipo de coisa no braço. Alguns frameworks como o Spring fazem isso de maneira mais segura e melhor, gerando um código consideravelmente mais limpo.
Também use um Pool de conexões decente.

Reinventar a roda além de pouquíssimo eficiente, faz com que você gaste dias se batendo em problemas que outros já resolveram.

PS: O seu código é escrito em Java 1.1? Se não é, por que está usando Vector?
Use um List (como o ArrayList), e preferencialmente, especifique o tipo de dado interno.

Olá Amigo, muito obrigado pelo retorno. O que você quer dizer com:

Também use um Pool de conexões decente.

A forma que utilizamos é errada? Tem mais parâmetros para adicionar?

No Aguardo

Renato

Queria dizer para vc usar uma solução pronta, como o Jakarta DBCP ou o C3P0 (não sei se o Zen ali usa).

Mas dê uma olhada no Spring. Você pode usar só a parte de banco de dados dele, sem todo IoC e outros recursos, já vai simplificar maravilhosamente a sintaxe.

Olá Vini. Novamente Obrigado pelo retorno.
Instalei no TOMCAT um programa chamado PROBE. Monitorei durante um dia e algo me chamou atenção. Na aba de DataSources:

Name Type Link to Authentication 
jdbc/bdzen  javax.sql.DataSource Additional info:jdbc:oracle:thin:@192.168.4.10:1521:f3ipro Max: 300 Busy: 219 Established: 220  

Perceba que está quase no MAX. Se reiniciar o tomcat, o Busy e o Established zeram, caso contrario, aumenta gradativamente e cai o tomcat exibindo a seguinte mensagem:

Pool Connection: Cannot get a connection, pool error Timeout waiting for idle object 

Se eu fizer o seguinte SQL no banco ORACLE:

select inst_id , username, logon_time, a.sid, a.serial#, a.status, a.osuser, A.machine from gv$session a where username is not null and machine in ('catserver')

INST_ID USERNAME LOGON_TIME SID SERIAL# STATUS OSUSER MACHINE
1 ZEN 16/09/2011 20:44 49 8454 INACTIVE administrador catserver
1 ZEN 16/09/2011 19:13 156 10840 INACTIVE administrador catserver
1 ZEN 16/09/2011 21:08 177 18682 INACTIVE administrador catserver

Já atualizei driver, tomcat, JDK etc etc etc e nada adiantou…Veja que no Banco de Dados tem somente 3 conexoes, mas o TOMCAT esta aguentando estas session.

Abraços e Obrigado

Você certamente tem um leak de conexões na sua aplicação. Se você não fechar corretamente as conexões sempre, isso ocorre mesmo.
Por isso, use algum framework que gerencie isso de maneira automática, como o Spring (que já comentei).

Também retirei o “URGENTE” do título do seu tópico. O fórum não é local para urgências.

Certeza q esta…
Se ta dificil achar no codigo…configura um tempo time out de conexão no proprio pool…para remediar essa situação até vc achar a natureza do problema…