У мене були дві проблеми в двох моїх програмах. Моя помилка була така:
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, ви можете звернутися до наступного:
Ось такі рішення:
- зміна атрибута "bind-address"
Скасуйте атрибут "bind-address" або змініть його на один із наступних ips:
bind-address = "127.0.0.1"
або
bind-address = "0.0.0.0"
- коментуючи "пропуск мережі"
Якщо у вашому файлі конфігурації MySQL є рядок "пропустити мережу", прокоментуйте це, додавши знак "#" на початку цього рядка.
- змінити "wait_timeout" та "interactive_timeout"
Додайте ці рядки до файлу конфігурації MySQL:
wait_timeout = число
interactive_timeout = число
connect_timeout = число
- перевірте налаштування проксі-операційної системи
Переконайтеся, що Fire Fire або антивірусні вироби не блокують службу MySQL.
Перевірте рядок запиту. у вашому рядку з'єднання має бути щось таке:
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, яка вказує на максимальний розмір пакета, а не на максимальну кількість пакетів. Тож вирішити цю помилку не допоможе.
змінити TOMCAT6_SECURITY = так на TOMCAT6_SECURITY = ні
- використовувати властивість validationQuery
використовуйте validationQuery = "select now ()", щоб переконатися, що кожен запит має відповіді
Додайте цей код до рядка з'єднання:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
Хоча не з цих рішень працювали для мене, я пропоную вам спробувати їх. Тому що є деякі люди, як вирішили свою проблему, виконуючи ці кроки.
Але що вирішило мою проблему? Моя проблема полягала в тому, що у мене було багато SELECT в базі даних. Кожен раз, коли я створював з'єднання, а потім закривав його. Хоча я закривав з'єднання кожного разу, але система зіткнулася з багатьма з’єднаннями і дала мені цю помилку. Що я зробив, це те, що я визначив свою змінну з'єднання як публічну (або приватну) змінну для цілого класу та ініціалізував її в конструкторі. Тоді щоразу я використовував це з'єднання. Це вирішило мою проблему, а також різко збільшило мою швидкість.
Висновок
Немає простого та унікального способу вирішення цієї проблеми. Я пропоную вам подумати над своєю власною ситуацією та вибрати вищевикладені рішення. Якщо ви допустите цю помилку на початку програми і взагалі не можете підключитися до бази даних, у вас може виникнути проблема в рядку підключення. Але якщо ви помилитеся після декількох успішних взаємодій із базою даних, проблема може бути у кількості підключень, і ви можете подумати про зміну "wait_timeout" та інших налаштувань MySQL або переписати свій код, як це зменшить кількість з'єднань.