Pergunta

Estou usando o MySQL 5.0 para um site que é hospedado pelo GoDaddy (linux).

Eu estava fazendo alguns testes no meu aplicativo web, e de repente percebi que as páginas foram refrescante muito devagar. Finalmente, depois de uma longa espera, eu comecei a uma página que disse algo ao longo das linhas de "Erro MySQL, Muitas conexões ...", e apontou para o meu arquivo config.php que se conecta ao banco de dados.

Tem sido apenas me conectar ao banco de dados, nenhum outro usuário. Em cada uma das minhas páginas, eu incluir o arquivo config.php no topo, e fechar a conexão mysql no final da página. Pode haver várias consultas entre os dois. Temo que eu não estou fechando conexões mysql suficiente (mysql_close ()).

No entanto, quando tento fechá-los depois de executar uma consulta, recebo erros de conexão na página. Minhas páginas são PHP e HTML. Quando eu tentar fechar uma consulta, parece que o próximo não vai ligar. Eu teria que incluir config.php novamente após o encerramento, a fim de conectar?

Este erro me assustou, porque em 2 semanas, cerca de 84 pessoas começam a usar esta aplicação web.

Graças.

EDIT:

Aqui estão algumas pseudo-código da minha página:

 require_once('../scripts/config.php');

 <?php
    mysql_query..

    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
 ?>
 some html..
 ..
 ..
 ..
 ..
 <?php
   another mysql_query...
 ?>
 some more html..
 ..
 ..
 <?php mysql_close(); ?>

Eu percebi que desta forma, cada vez que a página for aberta, a conexão é aberta, e depois fecha a conexão quando a página é feito o carregamento. Em seguida, a ligação abre novamente quando alguém clica em um botão na página, e assim por diante ...

EDIT:

Ok, então eu só tenho desligar o telefone com GoDaddy. Aparentemente, com o meu pacote Economia, eu estou limitado a 50 conexões simultâneas. Enquanto o meu problema hoje aconteceu com apenas me acessar o site, eles disseram que estavam tendo alguns problemas com o servidor anteriormente. No entanto, vendo como eu vou ter 84 usuários para meu aplicativo web, eu provavelmente deve atualizar para o "Deluxe", que permite a 100 conexões simultâneas. Em um determinado dia, pode haver cerca de 30 usuários que acessam o meu site em um tempo, então eu acho que o 100 seria uma aposta mais segura. Vocês concordam?

Foi útil?

Solução

Shared-provedores de hospedagem geralmente permitem uma muito pequena quantidade de conexões simultâneas para o mesmo usuário.

O seu código faz é:

  • abrir uma conexão com o servidor MySQL
  • fazê-lo de coisas (gerando página)
  • fechar a ligação no final da página.

A última etapa, quando feito no final da página não é obrigatório : (citando mysql_close 's manual):

Usando mysql_close () não é normalmente necessário, aberto como não-persistentes links são automaticamente fechadas ao final da execução do script.

Mas note que você provavelmente não deveria usar conexões persistentes de qualquer maneira ...

Duas dicas:

  • uso mysql_connect insead de mysql_pconnect (já OK para você)
  • Definir o quarto parâmetro de mysql_connect como false (já OK para você, como é o valor padrão) : (citando o manual):

Se uma segunda chamada é feita para mysql_connect () com a mesma argumentos, nenhuma nova ligação será estabelecida, mas em vez disso, o link identificador do link já abriu será retornado.

O new_link modifica parâmetros esse comportamento e faz mysql_connect () sempre aberta a nova ligação, mesmo se mysql_connect () foi chamado antes com a mesma parâmetros.



O que poderia causar o problema, então?

Talvez você está tentando acessar várias páginas em paralelo (usando múltiplas abas em seu browser, por exemplo) , que irá simular vários usuários usando o site ao mesmo tempo?

Se você tem muitos usuários que utilizam o site ao mesmo tempo e o código entre mysql_connect eo fechamento da conexão leva muito tempo, isso significará muitas conexões que está sendo aberto ao mesmo tempo ... E você vai chegar o limite de : - (

Ainda assim, como você é o único usuário do aplicativo, considerando que você tem até 200 conexões simultâneas permitidas, há algo estranho acontecendo ...



Bem, pensando em " muitas conexões " e "max_connections" ...

Se bem me lembro, max_connections não limita o número de conexões você pode abrir para o MySQL Server, mas o número total de conexões que podem bo aberta para que servidor, por qualquer pessoa se conectar a ele .

Citando a documentação do MySQL em muitas conexões :

Se você receber uma muitas conexões de erro ao tentar se conectar ao servidor mysqld, isso significa que todos ligações disponíveis estão a ser utilizados por outros clientes.

O número de conexões permitido é controlada pelos max_connections variável sistema. Seu valor padrão é 100. Se você precisa para suportar mais conexões, você deve definir um maior valor para essa variável.

Então, na verdade, o problema pode não vir de você nem seu código (o que parece bem, na verdade) : ele pode "apenas" ser que você não é o único a tentar ligar a essa servidor MySQL (lembre-se, "hospedagem compartilhada") , e que há muitas pessoas a usá-lo ao mesmo tempo ...

... E se eu estou certo e é esse , não há nada que você pode fazer para resolver o problema: enquanto há muitas bases de dados / usuários no servidor e que max_connection é conjunto de 200, você vai continuar sofrendo ...


Como nota: antes de voltar para GoDaddy pedindo-lhes sobre isso, seria bom se alguém poderia validar o que eu disse ^^

Outras dicas

Eu tinha cerca de 18 meses de lidar com isso ( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections- erro / )

As soluções que eu tinha (que se aplica a você) no final foram:

  1. ajustar o banco de dados de acordo com a MySQLTuner .
  2. desfragmentar as tabelas com base semanal sobre este pós

A desfragmentação script bash do post:

#!/bin/bash

# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND
Data_free > 0` | grep -v '^+' | sed 's,t,.,' )"

for fragment in $FRAGMENTED_TABLES; do
  database="$( echo $fragment | cut -d. -f1 )"
  table="$( echo $fragment | cut -d. -f2 )"
  [ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database;
  OPTIMIZE TABLE $table;" > /dev/null 2>&1
done

Certifique-se de não usar conexões persistentes. Isso geralmente é uma má idéia ..

Se você tem que .. No máximo você vai precisar para apoiar tanto as conexões que você tem apache processos. Você é capaz de alterar as max_connections definição?

Você está completamente certo de que o servidor de banco de dados é completamente dedicado a você?

Inicie a sessão no datbase como root e use "SHOW PROCESSLIST" para ver quem está conectado. Idealmente ligar este em seu sistema de monitoramento para ver quantas conexões existem ao longo do tempo e alerta se houver demasiados.

As conexões de banco de dados máxima pode ser configurado em my.cnf, mas cuidado com a falta de memória ou espaço de endereço.

Se você tiver acesso shell, use netstat para ver quantos soquetes são abertas para o seu banco de dados e de onde eles vêm.

No Linux, digite:

netstat -n -a |grep 3306

No Windows, digite:

netstat -n -a |findstr 3306

A solução poderia um desses, me deparei com este em um teste MCQA, mesmo eu não compreendeu qual é o certo!

Definir isso em my.cnf "set-variable = max_connections = 200"

Execute o comando "GLOBALmax_connections SET = 200"

Use sempre mysql_connect () função, a fim de se conectar ao servidor mysql

Use sempre mysql_pconnect () função, a fim de se conectar ao servidor mysql

A seguir são possíveis soluções:

1) Aumentar a configuração de conexão máximo, definindo a variável global no mysql.

set global max_connection=200;

Nota:. Ele irá aumentar a carga do servidor

2) Esvazie a sua pool de conexão como abaixo:

FLUSH HOSTS;

3) verificar o seu processlist PROCESSLIST e específico matar se você não quer nenhum deles.


Você pode referir-se o seguinte: -

link do artigo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top