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