Mysql
 sql >> база данни >  >> RDS >> Mysql

Решаване на повреда на комуникационната връзка с JDBC и MySQL

Имах същия проблем в две от моите програми. Грешката ми беше следната:

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.

Прекарах няколко дни, за да реша този проблем. Тествах много подходи, които са споменати в различни уеб сайтове, но нито един от тях не работи. Накрая промених кода си и разбрах какъв е проблемът. Ще се опитам да ви разкажа за различните подходи и да ги обобщя тук .

Докато търсех в интернет, за да намеря решението за тази грешка, разбрах, че има много решения, които работят за поне един човек, но други казват, че не работи за тях! защо има много подходи към тази грешка? Изглежда, че тази грешка може да възникне по принцип когато има проблем при свързването със сървъра . Може би проблемът е поради грешен низ на заявка или твърде много връзки към базата данни.

Затова ви предлагам да опитате всички решения едно по едно и не се отказвайте!

Ето решенията, които намерих в интернет и за всяко от тях има поне един човек, на когото проблема му е бил решен с това решение.

Съвет:За решенията, които трябва да промените настройките на MySQL, можете да се обърнете към следните файлове:

  • Linux:/etc/mysql/my.cnf или /etc/my.cnf (в зависимост от използваната дистрибуция на Linux и MySQL пакет)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Забележете, че това са ProgramData, а не Program Files)

Ето решенията:

  • промяна на bind-address атрибут:

    Разкоментирайте bind-address атрибут или го променете на един от следните IP адреси:

     bind-address="127.0.0.1"
    

    или

     bind-address="0.0.0.0"
    
  • коментиране на „skip-networking“

    Ако има skip-networking ред във вашия MySQL конфигурационен файл, направете го коментар, като добавите # знак в началото на този ред.

  • променете „wait_timeout“ и „interactive_timeout“

    Добавете тези редове към конфигурационния файл на MySQL:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    
  • Уверете се, че Java не превежда 'localhost' в [:::1] вместо [127.0.0.1]

    Тъй като MySQL разпознава 127.0.0.1 (IPv4 ), но не и :::1 (IPv6 )

    Това може да се избегне, като се използва един от двата подхода:

    1. В низа за връзка използвайте 127.0.0.1 вместо localhost за да избегнете localhost се превежда на :::1

    2. Стартирайте java с опцията -Djava.net.preferIPv4Stack=true да принуди Java да използва IPv4 вместо IPv6 . В Linux това може да се постигне и чрез стартиране (или поставяне в /etc/profile :

       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      
  • проверете настройките на прокси сървъра на операционната система, защитните стени и антивирусните програми

    Уверете се, че защитната стена или антивирусният софтуер не блокират услугата MySQL.

    Спрете временно iptables на linux. Ако iptables са неправилно конфигурирани, те могат да позволят изпращането на tcp пакети до порта mysql, но блокират връщането на tcp пакети при същата връзка.

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

    Спрете антивирусния софтуер на Windows.

  • промяна на низа за свързване

    Проверете низа на заявката си. вашият низ за връзка трябва да е нещо като това:

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

Уверете се, че нямате интервали в низа си. Целият низ за връзка трябва да продължава без никакви интервали.

Опитайте да замените "localhost" с адреса за обратна връзка 127.0.0.1. Също така опитайте да добавите номер на порт към низа си за връзка, като:

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

Обикновено портът по подразбиране за MySQL е 3306.

Не забравяйте да промените потребителското име и паролата на потребителското име и паролата на вашия MySQL сървър.

  • актуализирайте файла с библиотеката на драйвери JDK
  • тествайте различни JDK и JRE (като JDK 6 и 7)
  • не променяйте max_allowed_packet

"max_allowed_packet " е променлива в конфигурационния файл на MySQL, която показва максималния размер на пакета, а не максималния брой пакети. Така че няма да помогне за разрешаването на тази грешка.

  • променете сигурността на tomcat

променете TOMCAT6_SECURITY=да на TOMCAT6_SECURITY=не

  • използвайте свойството validationQuery

използвайте validationQuery="select now()", за да се уверите, че всяка заявка има отговори

  • Автоматично повторно свързване

Добавете този код към своя низ за връзка:

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

Въпреки че нито едно от тези решения не работи за мен, предлагам ви да ги опитате. Защото има хора, които са решили проблема си, като изпълнят тези стъпки.

Но какво реши проблема ми?

Проблемът ми беше, че имах много SELECT в базата данни. Всеки път създавах връзка и след това я затварях. Въпреки че затварях връзката всеки път, но системата се сблъска с много връзки и ми даде тази грешка. Това, което направих, беше, че дефинирах променливата си за връзка като публична (или частна) променлива за целия клас и я инициализирах в конструктора. Тогава всеки път, когато просто използвах тази връзка. Това реши проблема ми и също така увеличи скоростта ми драстично.

#Заключение#Няма прост и уникален начин за решаване на този проблем. Предлагам ви да помислите за собствената си ситуация и да изберете горните решения. Ако приемете тази грешка в началото на програмата и изобщо не можете да се свържете с базата данни, може да имате проблем във вашия низ за връзка. Но ако приемете тази грешка след няколко успешно взаимодействие с базата данни, проблемът може да е в броя на връзките и може да помислите за промяна на „wait_timeout“ и други настройки на MySQL или да пренапишете кода си как това намалява броя на връзките.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да записвам и извличам изображение на моя сървър в java webapp

  2. Изберете данни между диапазон от дата/час

  3. Как да открием дали дадена стойност съдържа поне една цифрова цифра в MySQL

  4. Какво е CHAR_LENGTH() в MySQL?

  5. MySQL match() against() - подреждане по уместност и колона?