sql >> Databáze >  >> RDS >> Mysql

Řešení selhání komunikačního spojení pomocí JDBC a MySQL

Měl jsem stejný problém ve dvou mých programech. Moje chyba byla tato:

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.

Strávil jsem několik dní řešením tohoto problému. Testoval jsem mnoho přístupů, které byly zmíněny na různých webových stránkách, ale žádný z nich nefungoval. Nakonec jsem změnil svůj kód a zjistil, v čem je problém. Pokusím se vám přiblížit různé přístupy a zde je shrnout .

Zatímco jsem hledal na internetu řešení této chyby, přišel jsem na to, že existuje mnoho řešení, která fungovala alespoň pro jednu osobu, ale jiní říkají, že jim nefunguje! Proč existuje mnoho přístupů k této chybě? Zdá se, že k této chybě může dojít obecně když dojde k problému s připojením k serveru . Možná je problém způsoben nesprávným řetězcem dotazu nebo příliš mnoha připojeními k databázi.

Takže vám doporučuji vyzkoušet všechna řešení jedno po druhém a nevzdávat se!

Zde jsou řešení, která jsem našel na internetu a pro každé z nich existuje alespoň jeden člověk, jehož problém byl tímto řešením vyřešen.

Tip:Řešení, která potřebujete ke změně nastavení MySQL, naleznete v následujících souborech:

  • Linux:/etc/mysql/my.cnf nebo /etc/my.cnf (v závislosti na distribuci Linuxu a použitém balíčku MySQL)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Všimněte si, že jde o ProgramData, nikoli Program Files)

Zde jsou řešení:

  • změna bind-address atribut:

    Zrušte komentář bind-address atribut nebo jej změňte na jednu z následujících IP adres:

     bind-address="127.0.0.1"
    

    nebo

     bind-address="0.0.0.0"
    
  • komentování „skip-networking“

    Pokud existuje skip-networking řádek ve vašem konfiguračním souboru MySQL, přidejte jej jako komentář přidáním # podepsat na začátku tohoto řádku.

  • změňte „wait_timeout“ a „interactive_timeout“

    Přidejte tyto řádky do konfiguračního souboru MySQL:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    
  • Ujistěte se, že Java nepřekládá 'localhost' do [:::1] místo [127.0.0.1]

    Protože MySQL rozpoznává 127.0.0.1 (IPv4 ), ale ne :::1 (IPv6 )

    Tomu by se dalo předejít použitím jednoho ze dvou přístupů:

    1. V připojovacím řetězci použijte 127.0.0.1 místo localhost abyste se vyhnuli localhost překládá se do :::1

    2. Spusťte java s volbou -Djava.net.preferIPv4Stack=true přinutit Java používat IPv4 místo IPv6 . V Linuxu toho lze dosáhnout také spuštěním (nebo umístěním do /etc/profile :

       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      
  • zkontrolujte nastavení proxy operačního systému, brány firewall a antivirové programy

    Ujistěte se, že firewall nebo antivirový software neblokuje službu MySQL.

    Dočasně zastavte iptables na linuxu. Pokud jsou iptables špatně nakonfigurovány, mohou povolit odesílání paketů tcp na port mysql, ale blokují návrat paketů tcp na stejné připojení.

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

    Zastavte antivirový software v systému Windows.

  • změnit připojovací řetězec

    Zkontrolujte řetězec dotazu. váš připojovací řetězec by měl být něco takového:

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

Ujistěte se, že v řetězci nejsou mezery. Celý připojovací řetězec by měl pokračovat bez mezer.

Zkuste nahradit "localhost" adresou zpětné smyčky 127.0.0.1. Zkuste také přidat číslo portu do připojovacího řetězce, například:

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

Obvykle je výchozí port pro MySQL 3306.

Nezapomeňte změnit uživatelské jméno a heslo na uživatelské jméno a heslo vašeho serveru MySQL.

  • aktualizujte soubor knihovny ovladače JDK
  • testujte různé JDK a JRE (jako JDK 6 a 7)
  • neměňte max_allowed_packet

"max_allowed_packet " je proměnná v konfiguračním souboru MySQL, která udává maximální velikost paketu, nikoli maximální počet paketů. Tuto chybu tedy nepomůže vyřešit.

  • změnit zabezpečení kocourků

změnit TOMCAT6_SECURITY=ano na TOMCAT6_SECURITY=no

  • použijte vlastnost validationQuery

použijte validationQuery="select now()", abyste se ujistili, že každý dotaz má odpovědi

  • Automatické opětovné připojení

Přidejte tento kód do připojovacího řetězce:

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

Ačkoli žádné z těchto řešení pro mě nefungovalo, doporučuji vám je vyzkoušet. Protože existují lidé, kteří svůj problém vyřešili provedením těchto kroků.

Co ale vyřešilo můj problém?

Můj problém byl, že jsem měl v databázi mnoho SELECTů. Pokaždé jsem vytvářel spojení a pak ho zavíral. I když jsem pokaždé zavíral připojení, ale systém se potýkal s mnoha připojeními a dal mi tu chybu. Udělal jsem to, že jsem definoval proměnnou připojení jako veřejnou (nebo soukromou) proměnnou pro celou třídu a inicializoval jsem ji v konstruktoru. Pokaždé jsem pak použil toto připojení. Vyřešilo to můj problém a také dramaticky zvýšilo rychlost.

#Závěr#Neexistuje žádný jednoduchý a jedinečný způsob, jak tento problém vyřešit. Navrhuji, abyste se zamysleli nad svou vlastní situací a zvolili výše uvedená řešení. Pokud se tato chyba objeví na začátku programu a nemůžete se vůbec připojit k databázi, můžete mít problém v připojovacím řetězci. Pokud však tuto chybu po několika úspěšných interakcích s databází provedete, problém může být v počtu připojení a můžete přemýšlet o změně "wait_timeout" a dalších nastavení MySQL nebo o přepsání kódu tak, aby se snížil počet připojení.



  1. Vypočítejte percentil v MySQL na základě součtů

  2. Vytvořit spouštěč pro protokolování SQL ovlivněné tabulky?

  3. Jak vytvořit soubor login.sql pro SQLcl

  4. Typy kurzoru SQL Server – pouze vpřed statický kurzor | Kurz SQL Server / Kurz TSQL