Dúvida DAO, conexão aberta

É 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 é kenedy@solutionsti.info (Estou estudando java… ainda estou aprendendo…) Obrigado.

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.

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);  
                 }  
 [...]  

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.

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.

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

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!