У меня была такая же проблема в двух моих программах. Моя ошибка была в следующем:
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:
связывать-адрес = "127.0.0.1"
или
связывать-адрес = "0.0.0.0"
- комментируя "пропустить сеть"
Если в вашем конфигурационном файле MySQL есть строка «skip-network», добавьте комментарий, добавив знак «#» в начале этой строки.
- изменить «wait_timeout» и «interactive_timeout»
Добавьте эти строки в файл конфигурации MySQL:
wait_timeout = число
interactive_timeout = число
connect_timeout = число
- проверьте настройки прокси операционной системы
Убедитесь, что Firewall или антивирусные программные продукты не блокируют службу 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
Хотя ни одно из этих решений не помогло мне, я предлагаю вам попробовать их. Потому что некоторые люди решили свою проблему, выполнив следующие действия.
Но что решило мою проблему? Моя проблема была в том, что у меня было много SELECTs в базе данных. Каждый раз, когда я создал соединение, а затем закрыл его. Хотя я закрывал соединение каждый раз, но система столкнулась со многими соединениями и выдала мне эту ошибку. Что я сделал, так это то, что я определил свою переменную соединения как общедоступную (или приватную) переменную для всего класса и инициализировал ее в конструкторе. Затем каждый раз, когда я просто использовал это соединение. Это решило мою проблему, а также значительно увеличило мою скорость.
Вывод
Нет простого и уникального способа решения этой проблемы. Я предлагаю вам подумать о собственной ситуации и выбрать вышеуказанные решения. Если вы берете эту ошибку в начале программы и вообще не можете подключиться к базе данных, у вас может быть проблема в строке подключения. Но если вы возьмете эту ошибку после нескольких успешных взаимодействий с базой данных, проблема может заключаться в количестве соединений, и вы можете подумать об изменении «wait_timeout» и других настроек MySQL или переписать свой код так, чтобы это уменьшило количество соединений.