Ir ao conteúdo
  • Cadastre-se
Danie1 Net0

Java Aplicação Java SE muito lenta com BD MySQL remoto, como otimizar?

Posts recomendados

Olá, pessoas. Estou desenvolvendo uma aplicação desktop com Java SE e testando o software com um banco de dados remoto ele fica muito lento, enquanto que com o banco de dados local funciona normalmente. A seguir segue um método de exemplo de como estou programando o CRUD (esse método também é o que mais demora para retornar a resposta quando a conexão é remota):

public List<EscolaTecnicaModel> pesquisar(EscolaTecnicaModel escolaTecnicaModel) throws Exception {
        Connection conexao = Conexao.abrirConexao();
        List<EscolaTecnicaModel> escolas = new ArrayList<>();
        String sqlSelect = "SELECT " +
                               "et.*, ad.usuario, ad.senha, c.nome AS nome_cidade, c.id_estado, e.nome AS nome_estado, e.codigo_uf " +
                           "FROM escolas_tecnicas et " +
                               "INNER JOIN administradores ad ON (et.id_administrador = ad.id_administrador) " +
                               "INNER JOIN cidades c ON (et.id_cidade = c.id_cidade) " +
                               "INNER JOIN estados e ON (c.id_estado = e.id_estado) "; 
        String sqlWhere = "";
        String sqlOrder = "ORDER BY et.nome ASC"; 
        
        if (!escolaTecnicaModel.getNome().trim().equals("")) {
            sqlWhere += "WHERE et.nome LIKE '%" + escolaTecnicaModel.getNome() + "%' "; 
        }       
        
        PreparedStatement psBuscarEscolas = conexao.prepareStatement(sqlSelect + sqlWhere + sqlOrder);
        ResultSet rsBuscaEscolas = psBuscarEscolas.executeQuery();
        
        if (rsBuscaEscolas.next()) {
            do {
                EscolaTecnicaModel escolaTecnica = new EscolaTecnicaModel();
                escolaTecnica.setIdEscolaTecnica(rsBuscaEscolas.getInt("id_escola"));
                escolaTecnica.setNome(rsBuscaEscolas.getString("nome"));
                escolaTecnica.setEmail(rsBuscaEscolas.getString("email"));
                escolaTecnica.setIdAdministrador(rsBuscaEscolas.getInt("id_administrador"));
                escolaTecnica.setUsuario(rsBuscaEscolas.getString("usuario"));
                escolaTecnica.setSenha(rsBuscaEscolas.getString("senha"));
                escolaTecnica.setNivel(AdministradorModel.Nivel.ESCOLA);
                escolaTecnica.getCidade().setIdCidade(rsBuscaEscolas.getInt("id_cidade"));
                escolaTecnica.getCidade().setNome(rsBuscaEscolas.getString("nome_cidade"));
                escolaTecnica.getCidade().getEstado().setIdEstado(rsBuscaEscolas.getInt("id_estado"));
                escolaTecnica.getCidade().getEstado().setNome(rsBuscaEscolas.getString("nome_estado"));
                escolaTecnica.getCidade().getEstado().setCodigoUf(rsBuscaEscolas.getString("codigo_uf"));
                escolaTecnica.getEndereco().setRua(rsBuscaEscolas.getString("rua"));
                escolaTecnica.getEndereco().setNumero(rsBuscaEscolas.getString("numero"));
                escolaTecnica.getEndereco().setBairro(rsBuscaEscolas.getString("bairro"));
                escolaTecnica.getEndereco().setCep(rsBuscaEscolas.getString("cep") == null ? "" : rsBuscaEscolas.getString("cep"));

                PreparedStatement psBuscarTelefones = conexao.prepareStatement("SELECT * FROM telefones_escolas_tecnicas WHERE id_escola = ?");
                psBuscarTelefones.setInt(1, escolaTecnica.getIdEscolaTecnica());
                ResultSet rsBuscarTelefones = psBuscarTelefones.executeQuery();

                while (rsBuscarTelefones.next()) {
                    TelefoneModel telefone = new TelefoneModel();
                    telefone.setDdd(rsBuscarTelefones.getString("ddd"));
                    telefone.setNumero(rsBuscarTelefones.getString("numero"));
                    telefone.setTipo(rsBuscarTelefones.getString("tipo"));

                    escolaTecnica.adicionarTelefone(telefone);
                }
                
                escolas.add(escolaTecnica);
                
                Conexao.fecharConexao(rsBuscarTelefones, psBuscarTelefones);
            } while (rsBuscaEscolas.next());
        } else {
            Conexao.fecharConexao(conexao, psBuscarEscolas, rsBuscaEscolas);
            
            throw new Exception("Nenhuma escola encontrada");
        }
        
        Conexao.fecharConexao(conexao, psBuscarEscolas, rsBuscaEscolas);
        
        return escolas;
    }

O que pode estar causando essa lentidão e como solucionar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde @Danie1 Net0

 

Se o banco de dados é o mesmo e com os mesmos dados, com a única diferença de um ser local e outro remoto, um dos problemas pode ser a própria conexão com a internet, ou a sua ou a do servidor remoto.

 

Você pode testar isso, pingando no servidor e verificando o tempo em ms.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 minutos atrás, Leonardo0308 disse:

Boa tarde @Danie1 Net0

 

Se o banco de dados é o mesmo e com os mesmos dados, com a única diferença de um ser local e outro remoto, um dos problemas pode ser a própria conexão com a internet, ou a sua ou a do servidor remoto.

 

Você pode testar isso, pingando no servidor e verificando o tempo em ms.

Sim, é o mesmo banco de dados. Minha conexão com a internet é boa, testei em outros computadores fora de casa e o problema persiste. Pingando o servidor o tempo médio é de uns 35/40ms.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se a aplicação é a mesma e o BD é o mesmo, a única coisa que eu vejo é a conexão.

 

Se não é a internet em si, pode ser o processamento desse banco remoto.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
27 minutos atrás, Leonardo0308 disse:

Se a aplicação é a mesma e o BD é o mesmo, a única coisa que eu vejo é a conexão.

 

Se não é a internet em si, pode ser o processamento desse banco remoto.

Na verdade, o SGBD é diferente... Localmente estou usando o MariaDB e no servidor remoto uso MySQL, porém o driver é do MySQL mesmo. Mas não é possível que esse seja  o problema... ou é?

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 minutos atrás, Danie1 Net0 disse:

Mas não é possível que esse seja  o problema... ou é?

 

Só testando para saber, mas uma coisa mais importante...a quantidade de dados é a mesma?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 horas atrás, Leonardo0308 disse:

 

Só testando para saber, mas uma coisa mais importante...a quantidade de dados é a mesma?

Sim, é a mesma, mas praticamente não há dados, só algumas tabelas "estáticas" que já estão populadas e outras poucas tuplas em outras tabelas para testar o programa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Me parece que o gargalo, na verdade, está na GUI na hora de preencher os campos com os dados do banco... Dá para otimizar esse tipo de coisa?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Danie1 Net0 mas você usa dados do banco na interface?

 

Defina esse "gargalo da interface".

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
agora, Leonardo0308 disse:

@Danie1 Net0 mas você usa dados do banco na interface?

 

Defina esse "gargalo da interface".

Me referi à interface gráfica do programa que estou desenvolvendo, ela trava as vezes... Eu estava pensando (tanto que criei esse tópico) que o problema estava no banco, mas a verdade é que a causa da lentidão está na exibição dos dados no banco na tela. Utilizei uma péssima "lógica" para listar cidades e estados, onde milhares de buscas estavam sendo feitas e por isso estava lento, mas já estou solucionando. Agradeço imensamente por sua disponibilidade em ajudar, obrigado. 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, se houver mais algum problema, não hesite em compartilha-lo conosco. :D 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!