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ů:
-
V připojovacím řetězci použijte
127.0.0.1
místolocalhost
abyste se vyhnulilocalhost
překládá se do:::1
-
Spusťte java s volbou
-Djava.net.preferIPv4Stack=true
přinutit Java používatIPv4
místoIPv6
. 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í.