Método Lento

7 respostas
nanquim

Tenho um método que está numa classe que é um JPanel. Esse método serve pra pegar as informações dos JTextFields. Ele cria um objeto com esses dados e passa pra classe gerenciadora de botões (que implementa action listener). Essa gerenciadora passa o objeto pra classe DAO inserir no BD.
Não sei se é a melhor forma, mas foi a solução que eu achei.

Só que esse botão está demorando muito pra terminar de rodar. Alguém pode me dizer como deixar mais rápido?

Método:

public void createUserObject(){
    //TODO Esse objeto é destruído quando o metodo for chamado outr vez?  
    Usuario temp = new Usuario();
    UsuarioDAO usrDAO = new UsuarioDAO();        
    
    temp.setNome(txtNome.getText());
    temp.setSobrenome(txtSobrenome.getText());
    temp.setUsuario(txtUsuario.getText());
    
    temp.setTelefone(txtTelefone.getText());
    if(emailValido(txtEmail.getText()) == true){
        temp.setConta(txtEmail.getText(), pass.getPassword());
    }else{
        JOptionPane.showMessageDialog(null, "Email Inválido");
    }
    
    temp.setDtNascimento(txtDtNasc.getText());
    
    if(!usrDAO.saveUserData(temp)){
        JOptionPane.showMessageDialog(null, "Erro ao salavar dados no BD");           
    }else{JOptionPane.showMessageDialog(null, "Salvo com sucesso");}     
}

Método que valida o email - na mesma classe do metodo acima

public boolean emailValido(String email){
    if(email != null && email.trim().length() > 0){
        String regexEmail = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
        Pattern pattern = Pattern.compile(regexEmail, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(email);
        if(matcher.matches()){
            return true;
        }   
    }
    return false;

O Método saveUserData: - classe dao

public boolean saveUserData(Usuario u){          
    
        sql = "INSERT INTO Conta (id_conta, email, senha) VALUES"
                + "(?,?,?)";
        try{
        ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
                       
        ps.setString(2, u.getConta().getEmail());
        String pass = new String(u.getConta().getPass());
        ps.setString(3, pass);
        ps.executeUpdate();                
            try{
            ResultSet chave = ps.getGeneratedKeys();
                if(chave.next()){
                    int fkConta = chave.getInt(1);
                    u.getConta().setId(fkConta);          
            }
            }catch(SQLException e){
                System.err.println("Erro ao recuperar chave estrangeira\n");
                e.printStackTrace();
            }
            saveUser(u);               
        return true;
        }catch(SQLException e){
            System.err.println("Erro ao inserir conta\n");
            e.printStackTrace();
            return false;
        }

7 Respostas

Rodrigo_Void

Já tentou via debug encontrar qual a linha que está demorando mais? Tente isso, pois pode não ser exatamente este método com problema e sim algum outro chamado por este, por exemplo o saveUserData da DAO.

FernandoFranzini

Gargalo de app normalmente é chamada remota, no seu caso , o acesso ao banco de dados.
Provavelmente abertura de conexão por click de botão.
Aonde vc ta abrindo o banco de dados?

nanquim

Ainda não fiz isso, vou dar uma olhada aqui

Obrigada

nanquim

numa classe “connection factory” (como a apostila da caelum ensina)

Usando SQLite

FernandoFranzini

Veja se vc não ta abrindo conexão per request…

nanquim

Como assim? Não entendi

FernandoFranzini

Conexão com banco de dados deve ser aberta somente 1 vez durante o ciclo do sistema e ser reutilizada nas diferentes telas e processos. Quando vc abre e fecha conexão varias vezes, é exatamente isso que deixa as operações lentas, pq vc acaba fazendo chamadas remotas + 2 por processo.

Criado 17 de janeiro de 2017
Ultima resposta 17 de jan. de 2017
Respostas 7
Participantes 3