Qual a melhor forma de usar uma conexão com o BD usando JNDI

0 respostas
F

Estou usando a seguinte classe para banco de dados:

public class BancoDados {

    public Connection conn;
    public PreparedStatement psmt;
    public ResultSet rs;
    
    public void open() throws GestaoContratosExceptions {
        try {
            Context ctx = new InitialContext();
            if (ctx == null) throw new NamingException("No initial context");

            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mydb");
            if (ds == null) throw new NamingException("No data source");

            conn = ds.getConnection();
            if (conn == null) throw new SQLException("No connection");            
        } catch (Exception erroOpenBD) {
            System.out.println("Erro ao conectar do BD");
            throw new GestaoContratosExceptions(erroOpenBD.getClass().getName(),
                "ConexaoBD", erroOpenBD.getMessage());            
        }
    }

    public void closeConn() {
        try {
            if (conn == null) return;
            conn.close();
            conn = null;            
        } catch (Exception erroCloseConn) {
            System.out.println("Erro ao fechar conn");
        }
    }
    
    public void closeResult() {
        try {
            if (rs == null) return;
            rs.close();
            rs = null;            
        } catch (Exception erroCloseResult) {
            System.out.println("Erro ao fechar rs");
        }
    }
    
    public void closePassQuery() {
        try {
            if (psmt == null) return;
            psmt.close();
            psmt = null;            
        } catch (Exception erroResult) {
            System.out.println("Erro ao fechar psmt");
        }
    }
    
    public void closeAll() {
        try {
            closePassQuery();
            closeResult();
            closeConn();
        } catch (Exception erroCloseBD) {
            System.out.println("Erro ao fechar Bando de Dados");
        }
    }
}

Para cada classe que usa uma conexão eu instancio a classe BancoDados e utilizo o conn, psmt e rs e depois em um método finally eu coloco o closeAll(); como abaixo:

public class TipoDAO {
    BancoDados bd = new BancoDados();
    

    private void preencheTipos(TipoDTO tipoDTO) throws SQLException {
        tipoDTO.setTipoID(bd.rs.getInt("tipoID"));
        tipoDTO.setTipo(bd.rs.getString("tipo"));
        tipoDTO.setInsumo(bd.rs.getString("insumo"));
    }
    
    private void preencheInsertUpdateTipos(final TipoDTO tipoDTO) throws SQLException {
        bd.psmt.setString(1, tipoDTO.getTipo().toUpperCase());
        bd.psmt.setString(2, tipoDTO.getInsumo().toUpperCase());
    } 
    
    public Result getListar() throws GestaoContratosExceptions, SQLException {
        try {
            bd.open();
            bd.psmt = bd.conn.prepareStatement("SELECT * FROM Tipos ORDER BY Tipo");
            bd.rs = bd.psmt.executeQuery();
            return ResultSupport.toResult(bd.rs);
        } finally {
            bd.closeAll();
        }
    }
    
    public void buscar(TipoDTO tipoDTO) throws GestaoContratosExceptions, SQLException {
        try {
            bd.open();
            bd.psmt = bd.conn.prepareStatement("SELECT * FROM Tipos " +
                "WHERE TipoID = ?");
            bd.psmt.setInt(1, tipoDTO.getTipoID());
            bd.rs = bd.psmt.executeQuery();
            if (bd.rs.next()) {
                preencheTipos(tipoDTO);
            }
        } finally {
            bd.closeAll();
        }
    }

    public void cadastrar(TipoDTO tipoDTO) throws GestaoContratosExceptions, SQLException {
        try {
            bd.open();
            bd.psmt = bd.conn.prepareStatement("INSERT INTO Tipos " +
                "(Tipo, Insumo) VALUES (?, ?)");
            preencheInsertUpdateTipos(tipoDTO);
            bd.psmt.executeUpdate();
        } finally {
            bd.closeAll();
        }
    }
    
    public void editar(TipoDTO tipoDTO) throws GestaoContratosExceptions, SQLException {
        try {
            bd.open();
            bd.psmt = bd.conn.prepareStatement("UPDATE Tipos SET " +
                "Tipo = ?, Insumo = ? WHERE TipoID = ?");
            preencheInsertUpdateTipos(tipoDTO);
            bd.psmt.setInt(3, tipoDTO.getTipoID());
            bd.psmt.executeUpdate();
        } finally {
            bd.closeAll();
        }
    }
    
    public void excluir(TipoDTO tipoDTO) throws GestaoContratosExceptions, SQLException {
        try {
            bd.open();
            bd.psmt = bd.conn.prepareStatement("DELETE FROM Tipos " +
                "WHERE TipoID = ?");
            bd.psmt.setInt(1, tipoDTO.getTipoID());
            bd.psmt.executeUpdate();
        } finally {
            bd.closeAll();
        }
    }
}

Desse jeito que estou usando funciona, mas é a forma correta? Talvez não seria melhor criar um novo objeto PreparedStatement e ResultSet em cada método? O método open do BancoDados deveria ser static?

Estou perguntando isso porque a memória do computador está sempre aumentando, será que tem alguma coisa a ver?

Obrigado

Criado 18 de setembro de 2006
Respostas 0
Participantes 1