Dúvida DAO, conexão aberta

6 respostas
D

É o Seguinte pessoal…
estou desenvolvimento um pequeno sistema em Swing e me deparei com o seguinte problema… da um certo momento eu preciso fazer um consulta SELECT no banco por ex. dos fornecedores só que assim que eu faço esse select eu fecho a conexão com o banco, mas neste caso eu preciso manter essa conexão aberta pois vou manipular algumas informações sobre este fornecedor de exemplo, ou seja tenho q trancar este registro para ninguém mais ter acesso a ele, descobri q eu posso usar o no Mysql o SELECT * FROM

FOR UPDATE. porém se eu n fechar a conexão dentro da minha classe q faz a consulta… eu não consigo fecha-la mais… vou postar o código pra entenderem melhor…
public interface fornecedoresDAO {

    void atualizar(Fornecedores fornecedor) throws Exception;

    void excluir(Fornecedores fornecedor) throws Exception;

    Fornecedores procurarFornecedores(Integer codigo) throws Exception;

    List procurarFornecedores(String nome) throws Exception;

    int salvar(Fornecedores fornecedor) throws Exception;

    List todosFornecedores() throws Exception;

}
public class ImpFornecedoresDAO implements fornecedoresDAO {

    Connection conn;

    //Construtor 
    public ImpFornecedoresDAO() throws Exception {
        try {
            this.conn = ConnectionFactory.getConnection();
        } catch (Exception e) {
            throw new Exception("Erro: " + ":\n" + e.getMessage());
        }
    }

    //Este Metodo retorna um objeto com as informações do banco, porém ele fecha a conexão liberando assim o lock no registro da tabela do banco de  dados
    public Fornecedores procurarFornecedores(Integer codigo) throws Exception {

        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        conn = this.conn;
        conn.setAutoCommit(false);
        try {

            ps = conn.prepareStatement("SELECT * from FORNECEDORES where codigo=? FOR UPDATE");
            ps.setInt(1, codigo);
            rs = ps.executeQuery();
            if (!rs.next()) {
                throw new Exception("Não foi encontrado nenhum registro com o codigo: " + codigo);
            }

            Integer uf = rs.getInt(2);
            Integer tipo_pessoa = rs.getInt(3);
            String razao_social = rs.getString(4);
            String nome_fantasia = rs.getString(5);
            String cnpj = rs.getString(6);
            String insc_estadual = rs.getString(7);
            String insc_municipal = rs.getString(8);
            String telefone = rs.getString(9);
            String fax = rs.getString(10);
            String celular = rs.getString(11);
            String endereco = rs.getString(12);
            String bairro = rs.getString(13);
            String cidade = rs.getString(14);
            String cep = rs.getString(15);
            String email = rs.getString(16);
            String rg = rs.getString(17);
            String cpf = rs.getString(18);
            Integer obs = rs.getInt(19);
            Date inicio_atividade = rs.getDate(20);
            String contato = rs.getString(21);

            return new Fornecedores(codigo, tipo_pessoa, tipo_pessoa, razao_social, nome_fantasia, endereco, bairro, cidade, cep, uf, email, telefone, fax, celular, obs, cnpj, cpf, insc_estadual, insc_municipal, rg, inicio_atividade, contato, email, telefone);

        } catch (SQLException sqle) {
            throw new Exception(sqle);
        } finally {
            ConnectionFactory.closeConnection(conn, ps, rs);           // <<=Não quero fechar a conexão agora...
        }
    }
}

Aqui é a classe onde recebo o resultado da consulta (componentes Swing… tables… etc…) onde vou manipular em memória… e vou chamar uma consulta de uptade (queria usar a mesma conexão para manter o registro em lock no banco… ) e depois deste update ai sim… dar um close na conexão.

[...]
                try {
                    fornecedoresdao = new ImpFornecedoresDAO();
                    fornecedor = fornecedoresdao.procurarFornecedores(fornecedor.getCodigo());
                } catch (Exception ex) {
                    Logger.getLogger(frmCadClientes.class.getName()).log(Level.SEVERE, null, ex);
                }
[...]

Qualquer coisa meu msn é [email removido] (Estou estudando java… ainda estou aprendendo…) Obrigado.

6 Respostas

L

Então, seu DAO esta com muita responsabilidade, ele não deveria ser o responsável por abrir e fechar a conexão, e sim receber ela no construtor por exemplo (injeção de dependencia).

Dessa forma, vc pode controlar melhor sua conexão, mantendo ela aberta por mais tempo.

D

Seria fazer assim???

[...]  
                try {  
                     Connection conn = New ConnectionFactoty();
                     fornecedoresdao = new ImpFornecedoresDAO(conn);  
                     fornecedor = fornecedoresdao.procurarFornecedores(fornecedor.getCodigo());  
                     conn.close();
                 } catch (Exception ex) {  
                     Logger.getLogger(frmCadClientes.class.getName()).log(Level.SEVERE, null, ex);  
                 }  
 [...]
L

Sim, assim vc tem mais cotrole e seu DAO não tanta responsabilidade

Agora para ficar melhor ainda, só falta colocar algum framework de ioc (tipo spring) ai, que ele gerencia a criação de objetos para vc… usando spring vc tera ajuda ateh para controlar a transação.

D

Mas eu consigo documentação em português pra esse assunto…??
eu fico meio perdido java tem tando framework… e eu vou lembrar to usando Swing.

L

Ix cara, para qualquer framework vc vai precisar entender um pouco de inglês, até tem material em português, mas vc com certeza vai chegar em um ponto que precisa conhecer e pesquisar em docs em inglês.

Segue alguns frameworks de ioc que você pode usar

Spring - http://static.springsource.org/spring/docs/2.5.x/reference/

Pico - Container http://www.picocontainer.org/introduction.html

Guice - http://code.google.com/p/google-guice/

A e isso é independente se você esta fazendo um sistema desktop ou web

D

Achou que vou de Spring mesmo… é o que to mais vendo falar sobre ele na internet… quanto ao inglês… até entendo alguma coisa… mas meu português é bem melhor hehehehe…(vou correr atraz disto…). vlw amigo pela ajuda… obrigado!

Criado 31 de julho de 2009
Ultima resposta 3 de ago. de 2009
Respostas 6
Participantes 2