sql >> Database >  >> RDS >> Mysql

Een storing in de communicatieverbinding oplossen met JDBC en MySQL

Ik heb hetzelfde probleem gehad in twee van mijn programma's. Mijn fout was deze:

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.

Ik heb een aantal dagen besteed om dit probleem op te lossen. Ik heb veel benaderingen getest die op verschillende websites zijn genoemd, maar geen van hen werkte. Ten slotte veranderde ik mijn code en ontdekte wat het probleem was. Ik zal proberen je te vertellen over verschillende benaderingen en ze hier samen te vatten .

Terwijl ik op internet zocht naar de oplossing voor deze fout, kwam ik erachter dat er veel oplossingen zijn die voor ten minste één persoon werkten, maar anderen zeggen dat het voor hen niet werkt! waarom zijn er veel manieren om deze fout te benaderen? Het lijkt erop dat deze fout in het algemeen kan optreden wanneer er een probleem is bij het verbinden met de server . Misschien is het probleem te wijten aan de verkeerde queryreeks of te veel verbindingen met de database.

Dus ik raad je aan om alle oplossingen een voor een te proberen en niet op te geven!

Dit zijn de oplossingen die ik op internet heb gevonden en voor elk van hen is er in ieder geval een persoon wiens probleem met die oplossing is opgelost.

Tip:voor de oplossingen die u nodig heeft om de MySQL-instellingen te wijzigen, kunt u de volgende bestanden raadplegen:

  • Linux:/etc/mysql/my.cnf of /etc/my.cnf (afhankelijk van de gebruikte Linux-distributie en MySQL-pakket)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Merk op dat het ProgramData is, niet Program Files)

Hier zijn de oplossingen:

  • wijzigen van bind-address kenmerk:

    Uncomment bind-address toekennen of wijzigen in een van de volgende IP's:

     bind-address="127.0.0.1"
    

    of

     bind-address="0.0.0.0"
    
  • commentaar op "skip-netwerken"

    Als er een skip-networking . is regel in uw MySQL-configuratiebestand, maak er een opmerking over door # . toe te voegen teken aan het begin van die regel.

  • wijzig "wait_timeout" en "interactive_timeout"

    Voeg deze regels toe aan het MySQL-configuratiebestand:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    
  • Zorg ervoor dat Java 'localhost' niet vertaalt naar [:::1] in plaats van [127.0.0.1]

    Aangezien MySQL 127.0.0.1 herkent (IPv4 ) maar niet :::1 (IPv6 )

    Dit kan worden vermeden door een van de volgende twee benaderingen te gebruiken:

    1. Gebruik in de verbindingsreeks 127.0.0.1 in plaats van localhost om localhost te vermijden wordt vertaald naar :::1

    2. Voer java uit met de optie -Djava.net.preferIPv4Stack=true Java dwingen om IPv4 te gebruiken in plaats van IPv6 . Op Linux kan dit ook worden bereikt door het uit te voeren (of het in /etc/profile te plaatsen) :

       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      
  • controleer de proxy-instellingen van het besturingssysteem, firewalls en antivirusprogramma's

    Zorg ervoor dat de firewall of antivirussoftware de MySQL-service niet blokkeert.

    Stop iptables tijdelijk op linux. Als iptables verkeerd zijn geconfigureerd, kunnen tcp-pakketten naar de mysql-poort worden verzonden, maar wordt voorkomen dat tcp-pakketten terugkomen op dezelfde verbinding.

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

    Stop antivirussoftware op Windows.

  • verbindingsreeks wijzigen

    Controleer uw queryreeks. je verbindingsreeks zou zoiets als dit moeten zijn:

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

Zorg ervoor dat je geen spaties in je string hebt. Alle verbindingsreeksen moeten worden voortgezet zonder spatietekens.

Probeer "localhost" te vervangen door het loopback-adres 127.0.0.1. Probeer ook een poortnummer toe te voegen aan uw verbindingsreeks, zoals:

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

Gewoonlijk is de standaardpoort voor MySQL 3306.

Vergeet niet de gebruikersnaam en het wachtwoord te wijzigen in de gebruikersnaam en het wachtwoord van uw MySQL-server.

  • werk uw JDK-stuurprogrammabibliotheekbestand bij
  • test verschillende JDK en JRE's (zoals JDK 6 en 7)
  • wijzig max_allowed_packet niet

"max_allowed_packet " is een variabele in het MySQL-configuratiebestand die de maximale pakketgrootte aangeeft, niet het maximale aantal pakketten. Het zal dus niet helpen om deze fout op te lossen.

  • Tomcat-beveiliging wijzigen

verander TOMCAT6_SECURITY=ja in TOMCAT6_SECURITY=nee

  • gebruik de eigenschap validationQuery

gebruik validationQuery="select now()" om ervoor te zorgen dat elke zoekopdracht antwoorden heeft

  • AutoReconnect

Voeg deze code toe aan uw verbindingsreeks:

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

Hoewel geen van deze oplossingen voor mij werkte, raad ik je aan ze te proberen. Omdat er mensen zijn die hun probleem hebben opgelost door deze stappen te volgen.

Maar wat loste mijn probleem op?

Mijn probleem was dat ik veel SELECT's in de database had. Elke keer was ik een verbinding aan het maken en deze vervolgens weer te sluiten. Hoewel ik elke keer de verbinding verbrak, maar het systeem had te maken met veel verbindingen en gaf me die fout. Wat ik deed was dat ik mijn verbindingsvariabele definieerde als een openbare (of privé) variabele voor de hele klas en deze in de constructor initialiseerde. Dan elke keer dat ik gewoon die verbinding gebruikte. Het loste mijn probleem op en verhoogde ook mijn snelheid enorm.

#Conclusie#Er is geen eenvoudige en unieke manier om dit probleem op te lossen. Ik raad je aan om na te denken over je eigen situatie en bovenstaande oplossingen te kiezen. Als u deze fout aan het begin van het programma krijgt en helemaal geen verbinding kunt maken met de database, heeft u mogelijk een probleem met uw verbindingsreeks. Maar als u deze fout opmerkt na meerdere succesvolle interacties met de database, kan het probleem zijn met het aantal verbindingen en kunt u overwegen om "wait_timeout" en andere MySQL-instellingen te wijzigen of uw code te herschrijven om het aantal verbindingen te verminderen.



  1. Hoe MySQL te installeren met phpMyAdmin op Ubuntu 14.04

  2. Veelvoorkomende MySql-interviewvragen en -antwoorden voor frisser + ervaren

  3. Verwijzen naar een alias elders in de SELECT-lijst

  4. DO's en DONT's voor indexen