Lentidao MySQL

9 respostas
M

Ola pessal!!
Estou desenvolvendo uma aplicação em java com MySQL, estava tudo bem em quanto eu estava rodando o servidor de MySQL na mesma maquina q a aplicação!! Mas quando eu fiz minha aplição conectar em um servidor de MySQL em outra maquina acontenceu uma tremenda lentidão! Também estou percebendo que existem muitos processoes em estado de “Sleep” quando executo o comando “Show precesslist” no MySQL, não sei se isso eh nomal, creio eu que não! Ja estou a vários dias tentando resolver isso, com as ideias que tive e que encontrei, mas ainda esta estremamente lenta!
Aqui está o fonte:

ResultSet rs = null;
Statement stm = null;
Vector result = new Vector();
stm = getConnect().getConnection().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = stm.executeQuery(sql);
while (rs.next()){
    Vector dados = new Vector();
    for (int c = 1; c <= campos.length; c++){
        dados.add(rs.getString(campos[c-1]));
    }
    result.add(dados);
}
rs.close();
rs = null;
stm.close();
stm = null;

Percebi que a execução do SQL está rapida, o que esta demorando muito eh a seguinte linda:

stm = getConnect().getConnection().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

Obrigado a todos!!

9 Respostas

foia

Você utiliza algum pool de conexões ?!

Kleber_Santos

magorv,

Tem quer ser analisado o seu Modelo de Dados, se as entidades estiverem coerentes e relacionadas, a partir daí vc consegue isolar o problema e identificar se é algo no banco de dados.

T
stm = getConnect().getConnection().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

Porque é que você usa esse tipo de statement (com CONCUR_UPDATABLE)? Se for só pra usar com um SELECT, e não para efetuar a atualização de algumas linhas, sobrecarrega algum lugar (não sei se no servidor ou no cliente).

Normalmente é melhor usar o statement padrão, que não permite contar as linhas (você tem de ir acumulando os resultados em um ArrayList ou Vector), mas não sobrecarrega o servidor.

M

Ola foia, nao estou ultilizando nao.

Amigo, creio eu que não. Porque localmente a velocidade é incrivel.

Thingol, eu removi os parametros do statement e continua do mesmo jeito!

Aae galera obrigado a todos!!
Se alguem ainda terver mais alguma sujestão posta por favor, eu não sei o q fazer mais!

T

Uma coisa que pode ocorrer é um problema de lentidão no instante de resolver o hostname para IP. Ou seja, se o nome da máquina do servidor é “magorvserver” e o IP for “169.128.23.45”, quanto tempo a máquina cliente leva para conectar (ou seja, o seu problema não é a query e sim a conexão?)
Se for isso, troque o nome pelo IP na string de conexão e tente novamente.

M

Amigo bao observerção essa sua!! Mas sempre usei o IP e nao o nome!!

T

Então você já eliminou uma causa (o tempo de conexão).
Você pode investigar outras coisas:

  • Qual o tipo de rede que liga as duas máquinas? (10MB, 100MB) Aproveite e veja se há algum problema de rede.

  • Muitos dados estão “passeando” pela rede? (ou seja, você dá um select sem where, puxando a tabela inteira, ou então você dá um select * que retorna 200 campos e pega só 2 campos? ) Se for isso, você pode otimizar as queries (ponha um critério melhor, e dê select apenas dos campos que vai usar)

  • etc.

foia

Faz o seguinte:
1 - ping do app pro bd;
2 - telnet do app na porta do mysql.
3 - tentou usar pool de conexões ?

Demora ?!

M

thingol:
Então você já eliminou uma causa (o tempo de conexão).
Você pode investigar outras coisas:…

amigo eh uma rede de 100MB, a rede eh pequena soh possue 4 maquinas
ate agora nao ouve problema nenhum na rede
em questão do select, eu sempre fiz somente com campos q eu precizei,e qualquer outro comando sql eh lento,

foia:
Faz o seguinte:
1 - ping do app pro bd;
2 - telnet do app na porta do mysql…

o ping esta normal
o telnet ainda noa testei
em questão do pool de conexão é o seguinte:
percebemos que a aplicação esta estremamente rapida quando executanda no mesmo servidor do MySQL, entao iremos ciar uma aplicação q irar rodar no servidor somente para executar o comando SQL, e a aplicação “cliente” se comunica com ela atravez de sockets UDP.

Amgos obrigado a todos novamente

Criado 18 de agosto de 2005
Ultima resposta 20 de ago. de 2005
Respostas 9
Participantes 4