Não foi possível conectar ao mysql através do conector JDBC através do Tomcat ou externamente

17

Instalei uma instalação padrão do mysql 5.5 e, embora possa conectar-me ao serviço mysql através do comando mysql, e o serviço parece estar em execução, não consigo conectar-me através do spring + tomcat ou de um conector jdbc externo.

Estou usando o seguinte URL:

jdbc:mysql://myserver.com:myport/mydb

com nome de usuário / senha adequados, mas recebo a seguinte mensagem:

server.com: 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.

e o tomcat lança:

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.
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

O que parece ser o mesmo problema, como se eu tentasse me conectar externamente.

Stefan Kendall
fonte
Eu enfrentei esse problema ao tentar conectar-me através do java ao meu banco de dados mysql, que é executado em outro servidor na minha LAN. ao executar o mesmo programa java no servidor que executa o mysql, ele estava se conectando sem problemas. da máquina externa, pude conectar-me ao banco de dados mysql usando o SQLYog, por exemplo (embora eu tenha primeiro que alterar o arquivo my.cnf para vincular a 0.0.0.0 em vez de 127.0.0.1). A resposta de Boden e o comentário sobre a troca do conector JDBC me indicaram a direção certa. Mudei o conector JDBC para a versão mais recente e de repente funcionou!
User2380870

Respostas:

18

Isso pode acontecer por vários motivos. Eu mesmo vi isso algumas semanas atrás, mas não me lembro qual era a correção para mim.

1) Verifique se o endereço ao qual o mysql está vinculado, provavelmente é 127.0.0.1 (somente), o que eu acredito ser o padrão (pelo menos no servidor Ubuntu padrão). Você terá que comentar o parâmetro bind-address em my.cnf para vincular a todos os endereços disponíveis (você não pode escolher vários, é um ou todos).

2) Se estiver vinculado ao 127.0.0.1 e você não conseguir se conectar usando "localhost", verifique se ele não está resolvendo para o endereço do host local IPv6 em vez do IPv4. (ou apenas use o endereço IP)

3) Verifique duas vezes e triplamente a porta em que o mysql está ouvindo.

4) Verifique se você está usando o conector JDBC correto para o seu JDK.

5) Verifique se você não está fazendo algo realmente bobo, como iniciar o mysql com --skip-networking.

Eu acho que minha primeira sugestão tem a maior promessa ... na verdade, acho que foi onde eu a vi recentemente ... Eu estava tentando conectar-se ao mysql remotamente (também no Ubuntu 8.04).

Boden
fonte
Apenas para adicionar o meu 2cent, o quarto funcionou para mim. Obrigado!
Janis Peisenieks
1
em relação a "Você precisará comentar o parâmetro bind-address em my.cnf para vincular a todos os endereços disponíveis", o padrão agora é escutar apenas no localhost; portanto, você pode precisar usar a linha "bind-address = 0.0. 0.0 "dentro de [mysqld].
Palo
13

Eu tive o mesmo problema em dois dos meus programas. Meu erro foi este:

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.

Passo alguns dias para resolver este problema. Eu testei muitas abordagens mencionadas em diferentes sites, mas nenhuma delas funcionou. Por fim, mudei meu código e descobri qual era o problema. Vou tentar falar sobre diferentes abordagens e resumir aqui .

Enquanto procurava na Internet para encontrar a solução para esse erro, descobri que existem muitas soluções que funcionavam para pelo menos uma pessoa, mas outras dizem que não funciona para elas! por que existem muitas abordagens para esse erro? Parece que esse erro pode ocorrer geralmente quando há um problema na conexão com o servidor . Talvez o problema seja devido à sequência de consultas incorreta ou a muitas conexões com o banco de dados.

Então, sugiro que você tente todas as soluções uma por uma e não desista!

Aqui estão as soluções que eu encontrei na internet e, para cada uma delas, há pelo menos uma pessoa que resolveu o problema com essa solução.

point: Para as soluções que você precisa alterar as configurações do MySQL, você pode se referir ao seguinte:

  • Linux: /etc/my.cnf

  • Windows: D: \ Arquivos de Programas \ mysql \ bin \ my.ini

Aqui estão as soluções:

  • alterando o atributo "endereço de ligação"

Remova o comentário do atributo "endereço de ligação" ou altere-o para um dos seguintes Ips:

endereço de ligação = "127.0.0.1"

ou

endereço de ligação = "0.0.0.0"

  • comentando "pular rede"

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

  • altere "wait_timeout" e "interactive_timeout"

Adicione estas linhas ao arquivo de configuração do MySQL:

wait_timeout = número

Interactive_timeout = número

connect_timeout = número

  • verifique as configurações de proxy do sistema operacional

Verifique se os softwares Fire wall ou Anti virus não bloqueiam o serviço MySQL.

  • alterar cadeia de conexão

Verifique sua string de consulta. sua cadeia de conexão deve ser algo como isto:

dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

Verifique se você não possui espaços em sua string. Toda a cadeia de conexão deve continuar sem caracteres de espaço.

Tente substituir "localhost" por sua porta, como 127.0.0.1. Tente também adicionar o número da porta à sua cadeia 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 o MySQL é 3306.

Não esqueça de mudar nome de usuário e senha para o nome de usuário e senha do seu servidor MySQL.

  • atualize seu arquivo de biblioteca de drivers JDK
  • teste diferentes JDK e JREs (como JDK 6 e 7)
  • não mude 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

mude TOMCAT6_SECURITY = yes para TOMCAT6_SECURITY = no

  • use a propriedade validationQuery

use validationQuery = "select now ()" para garantir que cada consulta tenha respostas

  • Reconexão automática

Adicione este código à sua cadeia de conexão:

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

Embora nenhuma dessas soluções funcionou para mim, sugiro que você as experimente. Porque há algumas pessoas que resolveram o problema seguindo estas etapas.

Mas o que resolveu meu problema? Meu problema era que eu tinha muitos SELECTs no banco de dados. Cada vez que eu criava a conexão e a fechava. Embora eu fechasse a conexão toda vez, 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 apenas usava essa conexão. Resolveu o meu problema e também aumentou drasticamente a minha velocidade.

Conclusão

Não há uma maneira simples e única de resolver esse 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, poderá haver um problema na sua cadeia de conexão. Mas se você pegar esse erro após várias interações bem-sucedidas no banco de dados, o problema pode estar relacionado ao número de conexões e você pode pensar em alterar "wait_timeout" e outras configurações do MySQL ou reescrever seu código como isso reduz o número de conexões.

Soheil
fonte
Eu também estava tendo esse problema! Mas eu havia inicialmente alterado o mysql para ouvir a porta 8888 em vez da 3306. SO, a resposta do @ sohail ajudou, eu apenas adicionei a porta 8888 ao meu uri e funcionou! Obrigado, um bando
Isso resolveu o problema para mim! Com a nossa configuração do Vagrant Homestead, por algum motivo, foi vinculado ao endereço fornecido à VM (10.0.2.15 no meu caso) em vez do localhost.
Lander
1

Se você estiver executando uma instalação do Linux, provavelmente terá o lokkit bloqueando as comunicações recebidas, exceto via SSH.

Efetue login como root e execute o comando lokkit no prompt, desative o firewall e o SElinux e veja se você tem o mesmo problema.

Verifique também se suas permissões foram definidas corretamente, para que tudo possa ser gravado nos locais corretos.

Stephen Thompson
fonte
Estou executando o Ubuntu 8.04. Eu provavelmente deveria ter mencionado isso. Você tem instruções específicas para essa distribuição? Vou pesquisar no Google em um momento, mas pensei em perguntar primeiro.
277 Stefan Kendall #
sudo ufw desativar irá desativar o Ubuntu Firewall
Stephen Thompson
Eu instalei o ufw e tentei habilitar a porta, mas nenhum dado.
276 Stefan Kendall #
O ufw e o iptables já foram desinstalados. Eu pensei que o ufw era uma ferramenta de gerenciamento que precisava ser instalada separadamente. Com certeza, "iptables" não produz esse comando e nenhum serviço iptables parece estar em execução.
276 Stefan Kendall #
Ok, finalmente, o que eu sempre descobri é que você não permite que o mysql ouça na interface eth0, e geralmente é apenas na interface localhost. Tente o seguinte. Altere jdbc: mysql: //myserver.com: myport / mydb para jdbc: mysql: // localhost: myport / mydb se isso funcionar, você deve fazer o seguinte dev.mysql.com/doc/refman/5.1/en/ can-não-connect-to-server.html
Stephen Thompson
1

Isso também pode ser causado por configurações de proxy incorretas . Eu tive esse problema ao tentar conectar via jdbc a uma instância do MySQL em execução em um dispositivo virtual Parallels no meu Mac. A conexão jdbc usa as configurações de rede no nível do sistema e, como eu estava atrás de um proxy SOCKS, tive que definir o host MySql como host não proxy (por exemplo, em um Mac, você pode configurá-lo em Configurações-> Rede-> Avançada- > Proxies e, finalmente, adicione o nome do host ou o endereço IP em "Ignorar as configurações de proxy para esses hosts e domínios").

Simone Bruno
fonte
1

O MySQL Connector / J suporta apenas TCP / IP Java não suporta conectividade de soquetes de domínio Unix

Se o MYSQL for iniciado com o sinalizador skip-networking ou se o MySQL estiver sendo executado atrás do firewall, a opção TCP / IP será desativada. Para que o Java não possa se comunicar com o MySQL.

Sankar.lp.gym
fonte
0

Eu tive um problema muito parecido por quase um dia, e isso me deixou louco! mas eu consegui encontrar a solução, e era muito, muito simples, você só precisa /etc/init.d/tomcat6 para alterar TOMCAT6_SECURITY = yes para TOMCAT6_SECURITY = no. não é a minha solução, encontrei-a aqui , como podem ver, estou executando o ubuntu, espero que funcione.


fonte
0

Eu tive o mesmo problema. A propriedade "bind-address" foi alterada no arquivo /etc/mysql/my.cnf para 0.0.0.0 e funciona. A linha correspondente em my.cnf é assim:

endereço de ligação = 0.0.0.0

Antes de ser definido como o endereço IP externo do servidor, parecia algo como:

endereço de ligação = 196.152.4.145

Eu acho que quando está definido para o endereço IP externo e não para o loop localhost, o servidor mysql está apenas conectado à placa de rede e não escuta as conexões do loop local.


fonte
0

tente seu endereço local para vincular o endereço no arquivo my.cnf

Conexão con = nulo;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://x62.xx8.x4x.x5:3306/mydb", "root", "root");
        try {
            System.out.println(con.getMetaData());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
ozgun bayrak
fonte