Dúvida conexão de bancod de dados - A evolução

1 resposta
B

Fala galera do fórum!!

Como tudo na vida existe a evolução. O desenvolvimento de software não fica atrás.
Tenho um aplicativo que vem crescendo ao longo do tempo e com isso vai tendo a necessidade de utilizar métodos de desenvolvimento mais concisos.

Inicialmente fazia minha conexão com o banco do jeito mais simples possível:
Conexão 1

Class.forName("org.postgresql.Driver");
url = "jdbc:postgresql://" + _Server + "/" + _NomeBanco; 
conn = DriverManager.getConnection(url, _UID, _Pass);

Depois houve a necessidade de pool:
Conexão 2

oPool = new Jdbc3PoolingDataSource();
oPool.setServerName(_Server);
oPool.setDatabaseName(_NomeBanco);
oPool.setUser(_UID);
oPool.setPassword(_Pass);
oPool.setMaxConnections(_MaxConnections);
oPool.setInitialConnections(_InitConnections);
conn = oPool.getConnection();

Agora estou passando para a utlização do contexto através do tomcat para futuramente usar um JBOSS da vida ou algo parecido
Conexão 3

InitialContext ic = new InitialContext();
String jndi = "java:comp/env/jdbc/BaseDados";
DataSource dsGeral = (DataSource) ic.lookup(jndi); 
conn = dsGeral.getConnection();

Até aqui nenhum segredo.
Tudo funcionando.Porém, neste último cenário, ocorre um pequeno erro.
Hoje minha aplicação já é modular ficando da seguinte maneira:
Classe de gerenciamento de dados:

public class Datasource{
    private Connection conn;
    private Statement stmt;

    private Connection AbreConn() throws SQLException, ClassNotFoundException{
        InitialContext ic = new InitialContext();
        String jndi = "java:comp/env/jdbc/BaseDados";
        DataSource dsGeral = (DataSource) ic.lookup(jndi); 
       conn = dsGeral.getConnection();
   }

   public ResultSe getBySQL(String strSQL){
        try{
		stmt = AbreConn().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
		return stmt.executeQuery(strSQL); 
	}catch(Exception ex){
		throw new Exception(ex.getMessage());
	}finally{
		FechaConn();
	}
   }
   public void FechaConn() throws SQLException{
		try{	
			if(conn != null){
				if(!conn.isClosed() ){
					conn.close();
				}			
			}
		}catch (SQLException e) {
			e.printStackTrace();
			//throw new SQLException("Erro ao fechar a conexão: " + e.getMessage());
		}

	}
}

O grande X é o “FechaConn”.
Abrindo a conexão utilizando Context, se eu fechar a conexão após dar o executeQuery em getBySQL no finally, eu não consigo acessar o ResultSet. Retorna um erro dizendo que o ResultSet está fechado.

O estranho é que se abrir a conexão como no exemplo 1 e 2, eu consigo fazer isso sem problemas.
Lembrando que depois de usar o ResultSet eu o fecho devidamente.
É isso mesmo? Existe alguma solução?

Terei que mudar a forma de trabalhar (primeiro usar o ResultSet e depois fechar ResultSet e Connection)?

1 Resposta

samuel.grigolato

O problema provavelmente é a implementação do DataSource que deve ter mudado quando passou a utilizar JNDI.

O ideal para ter um código portável é utilizar o ResultSet ainda com a conexão aberta, pois algumas configurações fazem com que o Result Set seja lazy, em outras palavras, carregue as informações somente quando requisitadas, o que requer uma conexão aberta durante o processo.

Criado 27 de julho de 2010
Ultima resposta 27 de jul. de 2010
Respostas 1
Participantes 2