Conexao, como reutilizar?

2 respostas
B

Boa noite galera...

Estou fazendo uma aplicaçao Desktop.
Estou usando DAO, depois posto o codigo abaixo, mas meu problema é, eu quero reutilizar a conexao aberta, mas não estou conseguindo. A conexao fecha a abre a todo comando no banco. Quando uso a aplicaçao no proprio computador onde está o postgre nao ha problema algum mas quando coloco o sistema na rede e acesso de outras maquinas fica muito lento pq toda hora ele tem que abrir a conexao.

Abaixo coloco como fiz:

// Essa é minha classe de conexao
public class CriaConexao {

    public static Connection getConexao() throws SQLException {
        String driver = "org.postgresql.Driver";
        String url = "jdbc:postgresql://localhost:5432/elen";
        String usuario = "sistema";
        String senha = "********";
        Connection con = null;
        
        try {
            if(con==null) // Aqui não funciona, ele sempre pega a con == null 
            {    
            Class.forName(driver);
            con = DriverManager.getConnection(url, usuario, senha);
            System.out.println("Banco de dados conectado");
            //return con;
            }

        } catch (ClassNotFoundException e) {
            System.out.println("\nNão foi possível estabelecer conexão com a base de dados.\n");
            e.printStackTrace();
            return null;
            
        }
        return con;
    }
}

// aqui é onde chamo a conexao e faco as alteracoes no banco

public class PacienteDao {
    
     private Connection conexao;
     
     public PacienteDao() throws SQLException{
        if (this.conexao==null) {
            try {
                this.conexao = CriaConexao.getConexao();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
     }
    
 
 public void altera(Paciente p) throws SQLException{
        String sql = "update paciente set pac_nome = ?, " +
                                         "pac_endereco = ?, " +
                                         "pac_bairro = ?, " +
                                         "pac_cidade = ?, " +
                                         "pac_cep = ?, " +
                                         "pac_telefone = ?, " +
                                         "pac_celular = ?, " +
                                         "pac_rg = ?, " +
                                         "pac_cpf = ?, " +
                                         "pac_email = ?, " +
                                         "pac_ativo = ?, " +
                                         "pac_situacao = ?, " +
                                         "pac_associacao = ? where pac_codigo = ?";
                                     
        PreparedStatement stmt = conexao.prepareStatement(sql);
        
        stmt.setString(1, p.getPac_nome());    
        stmt.setString(2, p.getPac_endereco());
        stmt.setString(3, p.getPac_bairro());
        stmt.setString(4, p.getPac_cidade());
        stmt.setString(5, p.getPac_cep());
        stmt.setString(6, p.getPac_telefone());
        stmt.setString(7, p.getPac_celular());
        stmt.setString(8, p.getPac_rg());
        stmt.setString(9, p.getPac_cpf());
        stmt.setString(10, p.getPac_email());
        stmt.setInt(11, p.getPac_ativo());
        stmt.setInt(12, p.getPac_situacao());
        stmt.setString(13, p.getPac_associacao());
        stmt.setInt(14, p.getPac_codigo());

        stmt.execute();
        stmt.close();
    }

}

alguem tem uma ideia de como reutilizar ja a conexao ativa?

NAO estou fazendo aplicacao WEB.

Desde ja Obrigado..
8)

2 Respostas

fantomas

Então...

Em uma olhada rápida percebi que o problema é o seguinte:

Você sempre cria e atribui NULO para a variável con ao executar o método getConexao() por causa disto o processamento do if ( if(con==null)) sempre informa TRUE. Para evitar isto você poderia transformar esta variável em um atributo da classe CriaConexao, que aliás seria interessante você trocar o nome dela para simplesmente Conexão.

Com estas alterações surge uma outra questão: FECHAR A CONEXÃO. Você poderia criar um método para fazer isto na classe conexão e pronto.

Exemplo 1 da sugestão:

public class Conexao { // ALTERAÇÃO

    private Connection con = null; // ALTERAÇÂO

    public static Connection getConexao() throws SQLException {
        String driver = "org.postgresql.Driver";
        String url = "jdbc:postgresql://localhost:5432/elen";
        String usuario = "sistema";
        String senha = "********";
        
        try {
            if(con==null) // Aqui não funciona, ele sempre pega a con == null 
            {    
            Class.forName(driver);
            con = DriverManager.getConnection(url, usuario, senha);
            System.out.println("Banco de dados conectado");
            //return con;
            }

        } catch (ClassNotFoundException e) {
            System.out.println("\nNão foi possível estabelecer conexão com a base de dados.\n");
            e.printStackTrace();
            return null;
            
        }
        return con;
    }

   public static closeConexao()  throws SQLException { // ALTERAÇÃO
       this.con.close();
   }
}

Exemplo 2 da sugestão.

public class Conexao { // ALTERAÇÃO

    private String driver = "org.postgresql.Driver";
    private String url = "jdbc:postgresql://localhost:5432/elen";


    private Connection con = null;

    private String usuario = null;
    private String senha = null;

    public Conexao(final String usuario, final String senha) {
    	this.usuario = usuario;
    	this.senha = senha;
    }


    public static Connection create() throws SQLException {
        
        try {
            if(con==null) // Aqui não funciona, ele sempre pega a con == null 
            {    
            Class.forName(driver);
            con = DriverManager.getConnection(this.url, this.usuario, this.senha);
            System.out.println("Banco de dados conectado");
            //return con;
            }

        } catch (ClassNotFoundException e) {
            System.out.println("\nNão foi possível estabelecer conexão com a base de dados.\n");
            e.printStackTrace();
            return null;
            
        }
        return con;
    }

   public static close()  throws SQLException { // ALTERAÇÃO
       this.con.close();
      this.con = null;
   }

}

P.S Os códigos aprensentados são apenas ilustrativos objetivando simplesmente uma melhor comunicação.

flws

B

Valeu fantomas.

Interessante, nem percebi que eu setava con= null.

Vou testar e depois posto o resultado…

Obrigado…

Criado 7 de março de 2010
Ultima resposta 8 de mar. de 2010
Respostas 2
Participantes 2