Problema com Pool de Conexões, fecho ou não as conexões?

3 respostas
fmduque

Pessoal,

Implementei o pool de conexões na minha aplicação, que hoje roda no JBoss 4.0.2. A princípio desenvolvi sem fechar as conexões, pois achava que o jboss iria gerenciar isso pra mim. Mas após um tempo que aplicação está no ar, recebo a exceção:

java.sql.SQLException: Closed Connection

Bom, resolvi fechar então as conexões. Estou alterando a aplicação para que ela use e "devolva" o pool, mas não estou conseguindo. Eu conecto uma vez e depois não consigo mais, recebo a exceção:

java.sql.SQLException: Connection handle has been closed and is unusable
Minha classe de conexão é a seguinte:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class Conexao {

   private static Connection con = null;
   public String vMsgInteracao;
	

   public Connection conectaDB() throws NamingException{
      if(con == null){
         try{
            Context initContext = new InitialContext();
            DataSource ds = (DataSource)initContext.lookup("java:/OracleDS");
            con = ds.getConnection();
            return con;
         }		
         catch(Exception e){
            vMsgInteracao = "Erro ao conectar no banco: " + e;
            return null;
         }
      }
      else{
         return con;
      }
   }
}
E nas outras classes faço da seguinte forma:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

public class Contrato {

   private Connection con;
   private PreparedStatement ps;
   public  ResultSet rs;
   private String	vSql;
   public  String	vMsgInteracao;

   public String getNomeResponsavelContrato(int contrato) throws SQLException{
	
      try{
         Conexao c = new Conexao();
         con = c.conectaDB();

         vSql = " SELECT nome FROM contrato WHERE cd_contrato=?";
         
         ps = con.prepareStatement(vSql);
         ps.setInt(1, contrato);
         rs = ps.executeQuery(); 
			
         if(rs.next()){
	         return rs.getString("nome");
         }else{
                 return null;
         }
      }
      
      catch (Exception e){
         System.out.println("Erro "+ e);
      }

      finally{
         if (rs != null) {
            try { rs.close(); } catch (SQLException e) { ; }
            rs = null;
         }
         if (ps != null) {
            try { ps.close(); } catch (SQLException e) { ; }
            ps = null;
         }
         if (con != null) {
            try { con.close(); } catch (SQLException e) { ; }
            con = null;
         }
      }
   }
}

Bom pessoal, gostaria de saber se realmente é necessário fechar as conexões e se sim, oque estou fazendo errado?

3 Respostas

christianovale

Cara, com certeza voce tem que fechar não só a sua conexão como também o Objeto PreparedStatement.

Eu também uso Pool de Conexao nas minhas aplicaçoes em todas elas eu faço:

statement.close;
conexao.close;

ao final do acesso ao BD.

T

Que tal trocar isto:
private static Connection con = null;

por isto:
private Connection con = null;

fmduque

Obrigado Cristiano pela resposta!

Oque ta pegando agora é fechar essa conexão, não sei oque estou fazendo errado. No script que postei estou fechando as conexões no finally. A aplicação roda 1 vez e depois não roda mais recebo a exceção:

java.sql.SQLException: Connection handle has been closed and is unusable

Existe pools disponíveis, pois vejo no jmx_console do JBoss, só não consigo pega-los.

Quanto a minha implementação, ela está certa?

Criado 3 de maio de 2006
Ultima resposta 3 de mai. de 2006
Respostas 3
Participantes 3