Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Resolvendo uma falha de link de comunicação com JDBC e MySQL


Eu tive o mesmo problema em dois dos meus programas. Meu erro foi esse:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Passei vários dias para resolver este problema. Eu testei muitas abordagens que foram mencionadas em diferentes sites, mas nenhuma delas funcionou. Finalmente mudei meu código e descobri qual era o problema. Vou tentar falar sobre diferentes abordagens e resumi-las aqui .

Enquanto eu procurava na internet a solução para esse erro, descobri que há muitas soluções que funcionaram para pelo menos uma pessoa, mas outras dizem que não funciona para ela! por que existem muitas abordagens para esse erro? Parece que este erro pode ocorrer geralmente quando há um problema na conexão com o servidor . Talvez o problema seja por causa da string de consulta errada ou muitas conexões com o banco de dados.

Por isso, sugiro que tente todas as soluções uma a uma e não desista!

Aqui estão as soluções que encontrei na internet e para cada uma delas, existe pelo menos uma pessoa cujo problema foi resolvido com essa solução.

Dica:Para as soluções que você precisa para alterar as configurações do MySQL, você pode consultar os seguintes arquivos:

  • Linux:/etc/mysql/my.cnf ou /etc/my.cnf (dependendo da distribuição Linux e do pacote MySQL usado)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Observe que é ProgramData, não Program Files)

Aqui estão as soluções:


  • alterando bind-address atributo:

    Descomente bind-address atribua ou altere-o para um dos seguintes IPs:
     bind-address="127.0.0.1"
    

    ou
     bind-address="0.0.0.0"
    

  • comentando "skip-networking"

    Se houver uma skip-networking linha em seu arquivo de configuração do MySQL, faça um comentário adicionando # sinal no início dessa linha.

  • alterar "wait_timeout" e "interactive_timeout"

    Adicione estas linhas ao arquivo de configuração do MySQL:
    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    

  • Certifique-se de que o Java não esteja traduzindo 'localhost' para [:::1] em vez de [127.0.0.1]

    Como o MySQL reconhece 127.0.0.1 (IPv4 ) mas não :::1 (IPv6 )

    Isso pode ser evitado usando uma das duas abordagens:

    1. Na string de conexão, use 127.0.0.1 em vez de localhost para evitar localhost sendo traduzido para :::1

    2. Execute o java com a opção -Djava.net.preferIPv4Stack=true para forçar o java a usar IPv4 em vez de IPv6 . No Linux, isso também pode ser feito executando (ou colocando-o dentro de /etc/profile :
       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      

  • verifique as configurações de proxy do sistema operacional, firewalls e programas antivírus

    Certifique-se de que o firewall ou software antivírus não esteja bloqueando o serviço MySQL.

    Pare o iptables temporariamente no linux. Se o iptables estiver configurado incorretamente, eles podem permitir que os pacotes tcp sejam enviados para a porta mysql, mas impedir que os pacotes tcp voltem na mesma conexão.
     # Redhat enterprise and CentOS
     systemctl stop iptables.service
     # Other linux distros
     service iptables stop
    

    Pare o software antivírus no Windows.

  • alterar a string de conexão

    Verifique sua string de consulta. sua string de conexão deve ser algo assim:
    dbName = "my_database";
    dbUserName = "root";
    dbPassword = "";
    String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
    

Certifique-se de não ter espaços em sua string. Toda a cadeia de conexão deve ser continua sem nenhum caractere de espaço.

Tente substituir "localhost" pelo endereço de loopback 127.0.0.1. Tente também adicionar o número da porta à sua string de conexão, como:
String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

Normalmente, a porta padrão para MySQL é 3306.

Não se esqueça de alterar o nome de usuário e senha para o nome de usuário e senha do seu servidor MySQL.
  • atualize seu arquivo de biblioteca de driver JDK
  • teste JDK e JREs diferentes (como JDK 6 e 7)
  • não altere max_allowed_packet

"max_allowed_packet " é uma variável no arquivo de configuração do MySQL que indica o tamanho máximo do pacote, não o número máximo de pacotes. Portanto, não ajudará a resolver esse erro.
  • alterar a segurança do tomcat

altere TOMCAT6_SECURITY=sim para TOMCAT6_SECURITY=não
  • use a propriedade validationQuery

use validationQuery="select now()" para garantir que cada consulta tenha respostas
  • Reconexão automática

Adicione este código à sua string de conexão:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

Embora nenhuma dessas soluções tenha funcionado para mim, sugiro que você as experimente. Porque existem algumas pessoas que resolveram seu problema seguindo estas etapas.

Mas o que resolveu meu problema?

Meu problema era que eu tinha muitos SELECTs no banco de dados. Cada vez eu estava criando uma conexão e depois fechando-a. Embora eu estivesse fechando a conexão todas as vezes, mas o sistema enfrentou muitas conexões e me deu esse erro. O que fiz foi definir minha variável de conexão como uma variável pública (ou privada) para toda a classe e inicializá-la no construtor. Então toda vez que eu usei essa conexão. Ele resolveu meu problema e também aumentou minha velocidade drasticamente.

#Conclusão#Não existe uma forma simples e única de resolver este problema. Eu sugiro que você pense sobre sua própria situação e escolha as soluções acima. Se você receber esse erro no início do programa e não conseguir se conectar ao banco de dados, pode haver um problema em sua string de conexão. Mas se você receber esse erro após várias interações bem-sucedidas com o banco de dados, o problema pode estar no número de conexões e você pode pensar em alterar "wait_timeout" e outras configurações do MySQL ou reescrever seu código para reduzir o número de conexões.