Ir ao conteúdo
  • Cadastre-se

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?

Link para o comentário
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
Link para o comentário
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.

Link para o comentário
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 é?

Link para o comentário
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.

Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!