[ Resolvido ] Abrir e fechar conexão em cada método

6 respostas
marcos3

Caros colegas, estou com dúvida em relação a conexão com o banco de dados. Estou utilizando o firebird 2.5.

Inicialmente criei uma "Fábrica de Conexões" conforme código abaixo:
public class FabricaConexao {
    private static final String driver = "org.firebirdsql.jdbc.FBDriver";
    private static final String url = "jdbc:firebirdsql:localhost/3050:C:/bd/PADRAOMVC.FDB";
    private static final String user = "SYSDBA";
    private static final String login = "masterkey";
    private static Connection objconexao = null;
    
    public FabricaConexao(){
        try{
            Class.forName(driver);
            objconexao = DriverManager.getConnection(url, user, login);
        }
        catch(ClassNotFoundException d){
            JOptionPane.showMessageDialog(null, "Driver para conexão ao Banco de Dados não localizado!\n" + d);
        }
        catch(SQLException b){
            JOptionPane.showMessageDialog(null, "Banco de Dados não localizado!\n" + b);
        }
    }
        
    public static Connection getConexao(){
        if(objconexao == null)
            new FabricaConexao();
        return objconexao;
    }
}
Depois, na classe responsável por persistir os dados no banco estou fazendo da seguinte forma:
public class CidadeDao {
    
    public CidadeDao(){}
    
    public void Salvar(CidadeModel dados){
        Connection con = FabricaConexao.getConexao();        
        PreparedStatement inserirSql = null;        
        String sql = "insert into cidade(codigo,nome,cep,uf) values(?,?,?,?)";                
        try{
            inserirSql = con.prepareStatement(sql);
            
            inserirSql.setString(1, dados.getCodigo());
            inserirSql.setString(2, dados.getNome());
            inserirSql.setString(3, dados.getCep());
            inserirSql.setString(4, dados.getUf());
            
            inserirSql.executeUpdate();
            inserirSql.close();
            //con.close();
        }
        catch(SQLException e){
            JOptionPane.showMessageDialog(null, "Falha na inserção de dados!\n"+e.getMessage());
        }
    }
}

No método Salvar() acima se descomentar a linha onde fecho a conexão só é possível salvar um registro e o programa precisa ser fechado para que consiga salvar um novo registro. Mas, se deixar comentado consigo salvar quantos registros forem necessários. E eles estão sendo armazenados de fato no banco de dados.

Já vi outros códigos onde a conexão é aberta e fechada em cada método. Estou cometendo algum erro nesse código?

6 Respostas

javaflex

Não abra e feche a conexão em cada método individual. Abra a conexão no inicio da requisição do usuário e feche no final, independente de quantos SELECTS, UPDATES, INSERTS forem feitos durante esse processo.

Se não tiver usando pool de conexões, avalie utilizá-lo.


Hibernate pode facilitar muito sua vida em CRUDs principalmente.

marcos3

Estou desenvolvendo minha aplicação utilização o padrão MVC, neste padrão é possível usar o Hibernate?

Relevem se estou fazendo pergunta infantil, mas é que comecei recentemente e ainda preciso absorver muita informação.

javaflex

marcos@marcos:
Estou desenvolvendo minha aplicação utilização o padrão MVC, neste padrão é possível usar o Hibernate?

Relevem se estou fazendo pergunta infantil, mas é que comecei recentemente e ainda preciso absorver muita informação.


Pode, é como se fosse um “DAO automático” de acordo com mapeamentos. Vai ajudar a evitar código repetitivo e facilitar a manutenção. Só não leve como bala de prata, use onde for ajudar, dependendo do tipo de sistema costuma ser na maioria dos casos. Quando tiver por exemplo situações complexas de querys como em relatórios, prefira usar SQL nativo, onde o próprio hibernate dá abertura a usar SQL quando necessário, e mesmo assim podendo ter auxilio de mapeamentos se isso for ajudar.

Aqui tem uma apostila http://www.k19.com.br/downloads/apostilas/java/k19-k21-persistencia-com-jpa2-e-hibernate.

marcos3

Javaflex, obrigado pelas dicas! Estão sendo de grande valia…só mais uma coisa, neste código inicial que postei porque se eu fechar a conexão ao final do método salvar eu não consigo inserir um novo registro?

Dessa forma preciso fechar o formulário e abrí-lo novamente para conseguir inserir um novo registro, ou seja, fica impossível fazer duas ou mais inserções consecutivas.

Tenho interesse em saber porque não dá certo daquela forma, mesmo que para fins didáticos… se você ou algum outro colega puder me auxiliar mais uma vez neste entendimento agradeço.

javaflex

Dar certo vai, mas pode acontecer de ficar reabrindo a conexao a toa, se durante a açao do usuario for preciso executar mais de um comando SQL.

marcos3

Entendi. Preciso agora praticar bastante. Obrigado.

Criado 25 de outubro de 2014
Ultima resposta 31 de out. de 2014
Respostas 6
Participantes 2