sql >> Database teknologi >  >> RDS >> Mysql

Løsning af en kommunikationsforbindelsesfejl med JDBC og MySQL

Jeg har haft det samme problem i to af mine programmer. Min fejl var denne:

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.

Jeg brugte flere dage på at løse dette problem. Jeg har testet mange tilgange, der er blevet nævnt på forskellige websteder, men ingen af ​​dem virkede. Til sidst ændrede jeg min kode og fandt ud af, hvad problemet var. Jeg vil prøve at fortælle dig om forskellige tilgange og opsummere dem her .

Mens jeg søgte på internettet for at finde løsningen på denne fejl, fandt jeg ud af, at der er mange løsninger, der fungerede for mindst én person, men andre siger, at det ikke virker for dem! hvorfor er der mange tilgange til denne fejl? Det ser ud til, at denne fejl kan opstå generelt når der er et problem med at oprette forbindelse til serveren . Måske skyldes problemet den forkerte forespørgselsstreng eller for mange forbindelser til databasen.

Så jeg foreslår, at du prøver alle løsningerne én efter én og ikke giver op!

Her er de løsninger, jeg fandt på internettet, og for hver af dem er der i det mindste en person, som hans problem er blevet løst med den løsning.

Tip:For de løsninger, du skal bruge for at ændre MySQL-indstillingerne, kan du se følgende filer:

  • Linux:/etc/mysql/my.cnf eller /etc/my.cnf (afhængigt af Linux-distributionen og den anvendte MySQL-pakke)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Bemærk at det er ProgramData, ikke Program Files)

Her er løsningerne:

  • ændre bind-address attribut:

    Fjern kommentar bind-address attribut eller ændre den til en af ​​følgende IP'er:

     bind-address="127.0.0.1"
    

    eller

     bind-address="0.0.0.0"
    
  • kommenterer "spring over netværk"

    Hvis der er en skip-networking linje i din MySQL-konfigurationsfil, skal du få den til at kommentere ved at tilføje # tegn i begyndelsen af ​​den linje.

  • skift "wait_timeout" og "interactive_timeout"

    Tilføj disse linjer til MySQL-konfigurationsfilen:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    
  • Sørg for, at Java ikke oversætter 'localhost' til [:::1] i stedet for [127.0.0.1]

    Da MySQL genkender 127.0.0.1 (IPv4 ), men ikke :::1 (IPv6 )

    Dette kunne undgås ved at bruge en af ​​to tilgange:

    1. Brug 127.0.0.1 i forbindelsesstrengen i stedet for localhost for at undgå localhost bliver oversat til :::1

    2. Kør java med muligheden -Djava.net.preferIPv4Stack=true for at tvinge java til at bruge IPv4 i stedet for IPv6 . På Linux kan dette også opnås ved at køre (eller placere det inde i /etc/profile :

       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      
  • tjek Operativsystemets proxyindstillinger, firewalls og antivirusprogrammer

    Sørg for, at firewallen eller antivirussoftwaren ikke blokerer MySQL-tjenesten.

    Stop iptables midlertidigt på linux. Hvis iptables er forkert konfigureret, kan de tillade, at tcp-pakker sendes til mysql-porten, men blokere for, at tcp-pakker kommer tilbage på den samme forbindelse.

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

    Stop antivirussoftware på Windows.

  • skift forbindelsesstreng

    Tjek din forespørgselsstreng. din forbindelsesstreng skal være sådan her:

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

Sørg for, at du ikke har mellemrum i din streng. Al forbindelsesstrengen skal fortsættes uden mellemrumstegn.

Prøv at erstatte "localhost" med loopback-adressen 127.0.0.1. Prøv også at tilføje portnummer til din forbindelsesstreng, f.eks.:

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

Normalt er standardporten for MySQL 3306.

Glem ikke at ændre brugernavn og adgangskode til brugernavnet og adgangskoden til din MySQL-server.

  • opdater din JDK-driverbiblioteksfil
  • test forskellige JDK og JRE'er (som JDK 6 og 7)
  • ændr ikke max_allowed_packet

"max_allowed_packet " er en variabel i MySQL-konfigurationsfilen, der angiver den maksimale pakkestørrelse, ikke det maksimale antal pakker. Så det hjælper ikke at løse denne fejl.

  • ændre tomcat-sikkerhed

skift TOMCAT6_SECURITY=ja til TOMCAT6_SECURITY=nej

  • brug validationQuery-egenskaben

brug validationQuery="select now()" for at sikre, at hver forespørgsel har svar

  • Opret forbindelse automatisk

Tilføj denne kode til din forbindelsesstreng:

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

Selvom ingen af ​​disse løsninger virkede for mig, foreslår jeg, at du prøver dem. For der er nogle mennesker, der har løst deres problem ved at følge disse trin.

Men hvad løste mit problem?

Mit problem var, at jeg havde mange SELECT'er på databasen. Hver gang oprettede jeg en forbindelse og lukkede den derefter. Selvom jeg lukkede forbindelsen hver gang, men systemet stod over for mange forbindelser og gav mig den fejl. Det, jeg gjorde, var, at jeg definerede min forbindelsesvariabel som en offentlig (eller privat) variabel for hele klassen og initialiserede den i konstruktøren. Så hver gang brugte jeg bare den forbindelse. Det løste mit problem og øgede også min hastighed dramatisk.

#Konklusion#Der er ingen enkel og unik måde at løse dette problem på. Jeg foreslår, at du tænker over din egen situation og vælger ovenstående løsninger. Hvis du tager denne fejl i starten af ​​programmet, og du slet ikke er i stand til at oprette forbindelse til databasen, kan du have problemer med din forbindelsesstreng. Men hvis du tager denne fejl efter flere succesfulde interaktioner med databasen, kan problemet være med antallet af forbindelser, og du kan overveje at ændre "wait_timeout" og andre MySQL-indstillinger eller omskrive din kode, hvordan det reducerer antallet af forbindelser.



  1. SQL IN vs SQL EKSISTERER

  2. PostgreSQL-mod:Hvad er "resjunk"?

  3. Masseindsæt datafiler i SQL Server

  4. Bedste DBaaS-løsninger til PostgreSQL