Lentidão na consulta a base de dados online

19 respostas
T

Boa tarde pessoal!
Eu estou com um enorme problema, que é seguinte.
Eu tenho andado a desenvolver uma aplicação que visa a gestão da minha pequena empresa familiar.
Quando comecei a desenvolve-la em JAVA com uma base de dados em MYSQL e até aqui tudo funcionou bem pois a base de dados teve sempre no computador em que a aplicação era executada.
Mas eu agora queria colocar a base de dados num servidor online e estou a usar este www.freemysql.net
O problema é que as minha queries demoravam cerca de 80 milisegundos a ser executadas localmente, e agora que passei para uma base de dados online este tempo subiu para 2600 milisegundos, que é muito tempo quando se quer fazer uma pesquisa a base de dados.

A minha questão é se é normal estes tempos de espera ou se sou eu que não estou a optimizar bem para trabalhar via web.

Vou deixar aqui as queries de select que uso normalmente

public ArrayList<Car> selectMat(String matricula){
    	ArrayList<Car> lstCar = new ArrayList<Car>();
    	ResultSet rs;
    	
    	query.open();
    	
    	try {
		
    		 rs = query.select("select * from car"+
         			" INNER JOIN mark ON(car.idMarca = mark.idMark)"+
         			" INNER JOIN model ON(car.idModelo = model.idModel) WHERE matricula like '"+matricula+"%'");
        
    		 Mark mark = null;
    		 Model model = null;
    	
    		while (rs.next()) {

    		mark = new Mark(rs.getInt("idMark"), rs.getString("mark"));
            	model = new Model(rs.getInt("idModel"), rs.getString("model"), mark);
            	
            	lstCar.add(new Car(rs.getString("matricula"), rs.getString("VIN"), mark,
                        model, rs.getDate("dataFabrico"), rs.getInt("yearMake"), rs.getString("tipoMotor"),
                        rs.getInt("cc"), rs.getString("fuel"), null));
            
    		}
			
			query.close();
		} catch (SQLException e) {
			query.close();
			e.printStackTrace();
		}
    	    	
    	return lstCar;
    }
    
     /**
     * @return Retorna uma LinkedList com todos os carros existentes na base de dados
     * @see LinkedList
     * @since V 1.5
     * */
    public ArrayList<Car> select() {

    	long time = System.currentTimeMillis();
    	
        ArrayList<Car> lst = new ArrayList<Car>();
        ResultSet rs;

        try {

            query.open();
            rs = query.selectPrepared("select * from car"+
            			" INNER JOIN mark ON(car.idMarca = mark.idMark)"+
            			" INNER JOIN model ON(car.idModelo = model.idModel)", null);
           
           Mark mark = null;
           Model model = null;
           
            while (rs.next()) {
            	
            	mark = new Mark(rs.getInt("idMark"), rs.getString("mark"));
            	model = new Model(rs.getInt("idModel"), rs.getString("model"), mark);
            	
                lst.add(new Car(rs.getString("matricula"), rs.getString("VIN"), mark,
                        model, rs.getDate("dataFabrico"), rs.getInt("yearMake"), rs.getString("tipoMotor"),
                        rs.getInt("cc"), rs.getString("fuel"), null));
            
            }

            query.close();

        } catch (SQLException e) {
        	e.printStackTrace();
            query.close();
        }
        System.out.println(System.currentTimeMillis()- time);
        return lst;
    }

Agradecia imenso a vossa ajuda!
Cumps, Tiago

19 Respostas

Flavio_machine

Já pensou em fazer paginação ? Porquê você colocou o base on line, ja pensou em usar RMI (ou melhor httpinvolquer do spring)?

T

Não! Não pensei em nada disso porque é a primeira vez que o estou a fazer! E na realidade não tenho muitos conhecimentos sobre essa vertente da programação.
Sendo assim o que você aconselha a usar?
O que quer dizer quando se refere a paginação?

Muito obrigado,
Tiago

FernandoFranzini

Segue algumas dicas se ajudar - http://fernandofranzini.wordpress.com/2009/12/16/praticas-de-aplicativos-web/

Flavio_machine

Paginação é você trazer um pouco de dados de cada vez, quando precisa de um relatório ou uma tabela grande.
Tem bastante coisa na net.
De uma olha na forma que você desenvolveu o sistema quando as tabelas são carregadas, será necessário carregar a tabela toda ? Quando carregar a tabela não é melhor colocar uma pesquisa para trazer sómente os dados necessários.
O RMI tem bastante coisa na net também.

T

Este artigo é realmente bom! Vai ajudar a fazer algumas optimizações! :smiley:


Paginação é você trazer um pouco de dados de cada vez, quando precisa de um relatório ou uma tabela grande.
Tem bastante coisa na net.
De uma olha na forma que você desenvolveu o sistema quando as tabelas são carregadas, será necessário carregar a tabela toda ? Quando carregar a tabela não é melhor colocar uma pesquisa para trazer sómente os dados necessários.
O RMI tem bastante coisa na net também.

Quando puxo todos os dados da base de dados é só para os meter no TableModel correspondente, ai o que posso fazer é carregar os 15 primeiros, e quando precisas carregar os outros 15 registos e por ai fora, caso o utilizador prefira fazer scroll na JTable!

Relativamente ao RMI parece que tenho de fazer uma pesquisa mais profunda!

Uma outra questão é, ao fazer estas optimizações posso continuar a usar a base de dados a nível local?

Mais uma vez obrigado!
Cumps, Tiago

T

Bem, após ler algumas coisas sobre RIM, surgiu-me muitas duvidas e a minha cabeça ficou um bagunça!
Nesta minha aplicação eu tenho a parte de ligação a base de dados junto com a minha parte de dados. A minha questão é Ao usar o RMI, tenho que fazer duas aplicações, uma cliente que roda no PC-Cliente e uma outra que roda no servidor, fisicamente diferente? :?

FernandoFranzini

tmagostinho:
Bem, após ler algumas coisas sobre RIM, surgiu-me muitas duvidas e a minha cabeça ficou um bagunça!
Nesta minha aplicação eu tenho a parte de ligação a base de dados junto com a minha parte de dados. A minha questão é Ao usar o RMI, tenho que fazer duas aplicações, uma cliente que roda no PC-Cliente e uma outra que roda no servidor, fisicamente diferente? :?

Sim…mas seu problema não era tempo de resposta do banco de dados? RMI não vai resolver isso não…

Andre_Fonseca

oi,

É muito provável que a lentidão seja por conta da consulta SQL em si.

Tente primeiro então otimizar a sua consulta, para isso pode usar o comando EXPLAIN do mysql e ir melhorando o SQL até ele retornar um tempo aceitável.

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

Outras sugestões de otimização no link abaixo

Só depois disso tente mudar a arquitetura da solução.

Você pode tentar usar por exemplo o Hibernate (e ai usar também cache de objetos) ou então criar uma Stored Procedure.

O Spring tem uma forma que eu gosto de trabalhar com SP’s, veja no link abaixo.

http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html

Abs

T

FernandoFranzini:
tmagostinho:
Bem, após ler algumas coisas sobre RIM, surgiu-me muitas duvidas e a minha cabeça ficou um bagunça!
Nesta minha aplicação eu tenho a parte de ligação a base de dados junto com a minha parte de dados. A minha questão é Ao usar o RMI, tenho que fazer duas aplicações, uma cliente que roda no PC-Cliente e uma outra que roda no servidor, fisicamente diferente? :?

Sim…mas seu problema não era tempo de resposta do banco de dados? RMI não vai resolver isso não…

Era e é!
Mas só quando coloco a base de dados online, porque se a base de dados tiver no localhost funciona 5*

Estive a analisar e o facto de ter a base de dados online transforma o meu programa numa verdadeira lentidão, e eu já tinha optimizado as queries… Agora não sei como as optimizar mais :?

É verdade que tenho algumas chaves primárias com AUTO_INCREMENT, mas não as consegui colocar de outra forma :?

Cumps, Tiago

FernandoFranzini

O que vc quer dizer “online” ? eu desconheço o termo…

T

Quando refiro “online”, quero dizer que tenho a minha base de dados num servidor de mysql na internet, neste caso tenho a minha base de dados em www.freemysql.net

Cumps, Tiago

FernandoFranzini

Seu problema é a “latência de rede” então…não a aplicação e nem o banco de dados…

  • Para melhorar vai ter que rever sua infra e ver o pq ta demorando para chegar no socket do MySQL e voltar para sua rede - largura de banda, firewall, switch etc…
T

FernandoFranzini:
Seu problema é a “latência de rede” então…não a aplicação e nem o banco de dados…

  • Para melhorar vai ter que rever sua infra e ver o pq ta demorando para chegar no socket do MySQL e voltar para sua rede - largura de banda, firewall, switch etc…

Eu quando trabalho com a base de dados local consigo que a aplicação funcione rápido e bem!

Ou seja, vou ter de arranjar um servidor melhor e que não seja FREE! Já agora conhecem algum servidor de MYSQL que seja realmente bom?

Cumps, Tiago

FernandoFranzini

Como assim "Já agora conhecem algum servidor de MYSQL que seja realmente bom?"
Servidor MySQL vc monta dentro da sua rede…compra a maquina, coloca um linux e o MySQL!

T

FernandoFranzini:
Como assim "Já agora conhecem algum servidor de MYSQL que seja realmente bom?"
Servidor MySQL vc monta dentro da sua rede…compra a maquina, coloca um linux e o MySQL!

Sim é uma solução mas não a que eu queria :?
Tinha pensado em arranjar um domínio para colocar também o website da empresa e então usar a base de dados mysql do domínio para fazer este efeito. Mas o melhor será mesmo criar um servidor físico na empresa certo?

Quero agradecer mais uma vez o quanto vocês são espectaculares em ajudar os outros!
Cumps, Tiago

FernandoFranzini

Sim… infelizmente acessar o banco fora da seu rede tem estes problemas de latência sim…
T+

T

FernandoFranzini:
Sim… infelizmente acessar o banco fora da seu rede tem estes problemas de latência sim…
T+

Então e caso eu crie uma rede interna para o servidor de mysql é possivel fazer uma VPN para ter acesso a base de dados fora da empresa?

Cumps, Tiago

hvivox

tmagostinho:
Bem, após ler algumas coisas sobre RIM, surgiu-me muitas duvidas e a minha cabeça ficou um bagunça!
Nesta minha aplicação eu tenho a parte de ligação a base de dados junto com a minha parte de dados. A minha questão é Ao usar o RMI, tenho que fazer duas aplicações, uma cliente que roda no PC-Cliente e uma outra que roda no servidor, fisicamente diferente? :?

Isso, o cliente chama o servidor, que executa de terminado procedimento ao executar determinado procedimento ele passa a bola para o cliente, porém o grande diferencial é que no código, parece que o servidor não foi chamado.

T

hvivox:
tmagostinho:
Bem, após ler algumas coisas sobre RIM, surgiu-me muitas duvidas e a minha cabeça ficou um bagunça!
Nesta minha aplicação eu tenho a parte de ligação a base de dados junto com a minha parte de dados. A minha questão é Ao usar o RMI, tenho que fazer duas aplicações, uma cliente que roda no PC-Cliente e uma outra que roda no servidor, fisicamente diferente? :?

Isso, o cliente chama o servidor, que executa de terminado procedimento ao executar determinado procedimento ele passa a bola para o cliente, porém o grande diferencial é que no código, parece que o servidor não foi chamado.

Então isso quer dizer que quando penso em fazer um acesso por VPN vou ter de fazer uma topologia Cliente-Servidor e não posso continuar a fazer como mostrei em cima?

Criado 14 de julho de 2011
Ultima resposta 12 de set. de 2011
Respostas 19
Participantes 5