sql >> Databasteknik >  >> RDS >> Mysql

Att lösa ett kommunikationslänksfel med JDBC och MySQL

Jag har haft samma problem i två av mina program. Mitt fel var detta:

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.

Jag tillbringade flera dagar för att lösa detta problem. Jag har testat många metoder som har nämnts på olika webbplatser, men ingen av dem fungerade. Till slut ändrade jag min kod och fick reda på vad som var problemet. Jag ska försöka berätta om olika tillvägagångssätt och sammanfatta dem här .

Medan jag letade på internet för att hitta lösningen på det här felet kom jag på att det finns många lösningar som fungerade för minst en person, men andra säger att det inte fungerar för dem! varför finns det många metoder för detta fel? Det verkar som om det här felet kan uppstå allmänt när det är problem med att ansluta till servern . Kanske beror problemet på fel frågesträng eller för många anslutningar till databasen.

Så jag föreslår att du provar alla lösningar en efter en och inte ger upp!

Här är lösningarna som jag hittade på internet och för var och en av dem finns det åtminstone en person som hans problem har lösts med den lösningen.

Tips:För de lösningar som du behöver för att ändra MySQL-inställningarna kan du hänvisa till följande filer:

  • Linux:/etc/mysql/my.cnf eller /etc/my.cnf (beroende på Linux-distributionen och MySQL-paketet som används)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Observera att det är ProgramData, inte Program Files)

Här är lösningarna:

  • ändra bind-address attribut:

    Avkommentera bind-address attribut eller ändra det till någon av följande IP:er:

     bind-address="127.0.0.1"
    

    eller

     bind-address="0.0.0.0"
    
  • kommenterar "hoppa över nätverk"

    Om det finns en skip-networking rad i din MySQL-konfigurationsfil, låt den kommentera genom att lägga till # tecken i början av den raden.

  • ändra "wait_timeout" och "interactive_timeout"

    Lägg till dessa rader i MySQL-konfigurationsfilen:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    
  • Se till att Java inte översätter "localhost" till [:::1] istället för [127.0.0.1]

    Eftersom MySQL känner igen 127.0.0.1 (IPv4 ) men inte :::1 (IPv6 )

    Detta kan undvikas genom att använda en av två metoder:

    1. Använd 127.0.0.1 i anslutningssträngen istället för localhost för att undvika localhost översätts till :::1

    2. Kör java med alternativet -Djava.net.preferIPv4Stack=true för att tvinga java att använda IPv4 istället för IPv6 . På Linux kan detta också uppnås genom att köra (eller placera det i /etc/profile :

       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      
  • kontrollera proxyinställningar för operativsystem, brandväggar och antivirusprogram

    Se till att brandväggen eller antivirusprogramvaran inte blockerar MySQL-tjänsten.

    Stoppa iptables tillfälligt på linux. Om iptables är felkonfigurerade kan de tillåta att tcp-paket skickas till mysql-porten, men blockera tcp-paket från att komma tillbaka på samma anslutning.

     # Redhat enterprise and CentOS
     systemctl stop iptables.service
     # Other linux distros
     service iptables stop
    

    Stoppa antivirusprogram på Windows.

  • ändra anslutningssträng

    Kontrollera din frågesträng. din anslutningssträng bör vara något sånt här:

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

Se till att du inte har mellanslag i strängen. Hela anslutningssträngen ska fortsätta utan mellanslag.

Försök att ersätta "localhost" med loopback-adressen 127.0.0.1. Försök även lägga till portnummer till din anslutningssträng, som:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

Vanligtvis är standardporten för MySQL 3306.

Glöm inte att ändra användarnamn och lösenord till användarnamnet och lösenordet för din MySQL-server.

  • uppdatera din JDK-drivrutinsbiblioteksfil
  • testa olika JDK och JRE (som JDK 6 och 7)
  • ändra inte max_allowed_packet

"max_allowed_packet " är en variabel i MySQL-konfigurationsfilen som anger den maximala paketstorleken, inte det maximala antalet paket. Så det hjälper inte att lösa det här felet.

  • ändra tomcat-säkerhet

ändra TOMCAT6_SECURITY=ja till TOMCAT6_SECURITY=nej

  • använd egenskapen validationQuery

använd validationQuery="select now()" för att se till att varje fråga har svar

  • AutoReconnect

Lägg till den här koden i din anslutningssträng:

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

Även om ingen av dessa lösningar fungerade för mig, föreslår jag att du provar dem. Eftersom det finns några människor som löste sina problem genom att följa dessa steg.

Men vad löste mitt problem?

Mitt problem var att jag hade många SELECT i databasen. Varje gång skapade jag en anslutning och stängde den sedan. Även om jag stängde anslutningen varje gång, men systemet stod inför många anslutningar och gav mig det felet. Vad jag gjorde var att jag definierade min anslutningsvariabel som en offentlig (eller privat) variabel för hela klassen och initierade den i konstruktorn. Sedan använde jag den anslutningen varje gång. Det löste mitt problem och ökade också min hastighet dramatiskt.

#Slutsats#Det finns inget enkelt och unikt sätt att lösa detta problem. Jag föreslår att du tänker på din egen situation och väljer ovanstående lösningar. Om du tar detta fel i början av programmet och du inte kan ansluta till databasen alls, kan du ha problem med din anslutningssträng. Men om du tar det här felet efter flera framgångsrika interaktioner med databasen, kan problemet bero på antalet anslutningar och du kanske funderar på att ändra "wait_timeout" och andra MySQL-inställningar eller skriva om din kod för att minska antalet anslutningar.



  1. Ramen för ett Apache Spark Job Run!

  2. mySQL konvertera varchar till datum

  3. Stoppa (lång) körning av SQL-fråga i PostgreSQL när session eller begäranden inte längre existerar?

  4. MySQL TIMEDIFF() vs TIMESTAMPDIFF():Vad är skillnaden?