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)?