Решение "сбоя линии связи" с JDBC и MySQL
Я пытаюсь подключиться к локальному серверу MySQL, но я все равно получаю сообщение об ошибке.
Вот код.
public class Connect {
public static void main(String[] args) {
Connection conn = null;
try {
String userName = "myUsername";
String password = "myPassword";
String url = "jdbc:mysql://localhost:3306/myDatabaseName";
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(url, userName, password);
System.out.println("Database connection established");
} catch (Exception e) {
System.err.println("Cannot connect to database server");
System.err.println(e.getMessage());
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
System.out.println("Database Connection Terminated");
} catch (Exception e) {}
}
}
}
}
и ошибки:
Cannot connect to database server
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.
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.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at Connect.main(Connect.java:16)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:218)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294)
... 15 more
Я установил путь к классам, убедился, что my.cnf отключил опцию пропускной сети.
версия java - 1.2.0_26 (64 бит)
mysql 5.5.14
Разъем mysql 5.1.17
Я убедился, что пользователь имеет доступ к моей базе данных.
Ответы
Ответ 1
У меня была такая же проблема в двух моих программах. Моя ошибка:
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, а не на программные файлы)
Вот решения:
- изменение атрибута "привязка-адрес"
Исключить атрибут "связывать-адрес" или изменить его на один из следующих IP-адресов:
связывают-адрес = "127.0.0.1"
или
связывают-адрес = "0.0.0.0"
- комментирование "skip-networking"
Если в вашем файле конфигурации MySQL есть строка "skip-networking", сделайте комментарий, добавив знак "#" в начале этой строки.
- изменить "wait_timeout" и "interactive_timeout"
Добавьте эти строки в конфигурационный файл MySQL:
wait_timeout= номер
interactive_timeout = число
connect_timeout = число
- Убедитесь, что Java не переводит 'localhost' в [: 1] вместо [127.0.0.1]
Так как MySQL распознает 127.0.0.1 (IPv4), но не: 1 (IPv6)
Этого можно избежать, используя один из двух подходов:
Вариант №1: В строке подключения используйте 127.0.0.1 вместо 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" на адрес loopback 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 или переписать код, чтобы уменьшить количество подключений.
Ответ 2
Если вы используете MAMP PRO, это простое исправление, которое я действительно хотел бы реализовать, прежде чем я начал искать интернет в течение нескольких дней, пытаясь понять это. Это действительно так просто...
Вам нужно просто щелкнуть "Разрешить доступ к сети MySQL" на вкладке MAMP MySQL.
Действительно, вот оно.
О, и вам нужно будет по-прежнему изменить свой адрес связывания на 0.0.0.0 или 127.0.0.1, как указано в приведенных выше сообщениях, но щелчок на этом поле, вероятно, решит ваши проблемы, если вы являетесь пользователем MAMP.
Ответ 3
Настройка bind-address
на сетевой IP-адрес сервера вместо localhost по умолчанию, и для меня работают настройки прав для моего пользователя.
my.cnf:
bind-address = 192.168.123.456
Консоль MySql:
GRANT ALL PRIVILEGES ON dbname.* to [email protected]'%' IDENTIFIED BY 'password';
Ответ 4
Как говорится в подробном ответе выше, эта ошибка может быть вызвана многими вещами.
У меня тоже была эта проблема. Моя настройка была Mac OSX 10.8, с использованием виртуальной виртуальной машины Vagrant от Ubuntu 12.04 с MySQL 5.5.34.
Я правильно настроил переадресацию портов в файле конфигурации Vagrant. Я мог бы использовать telnet для экземпляра MySQL как с моего Mac, так и из VM. Поэтому я знал, что демон MySQL работает и доступен. Но когда я пытался подключиться через JDBC, я получил ошибку "Ошибка связи".
В моем случае проблема была решена путем редактирования файла /etc/mysql/my.cnf. В частности, я прокомментировал строку "# bind-address = 127.0.0.1".
Ответ 5
В моем случае это был тайм-аут простоя, из-за которого соединение было отключено на сервере. Соединение поддерживалось открытым, но не использовалось в течение длительного периода времени. Затем перезапускается клиентский перезапуск, в то время как я считаю, что повторное подключение также будет работать.
Неплохое решение состоит в том, чтобы время/время было подключаться к демону/службе.
Ответ 6
Я столкнулся с той же проблемой.
Это произошло потому, что MySQL Daemon был привязан к IP-адресу машины, что требуется для установления связи с пользователем, у которого есть разрешение на подключение @your_machine.
В этом случае у пользователя должно быть разрешение на подключение USER_NAME @MACHINE_NAME_OR_IP
Мне нужен удаленный доступ к моей машине, поэтому я изменил его в my.cnf из
bind-address = MY_IP_ADDRESS
Для
bind-address = 0.0.0.0
Это позволит пользователю с localhost И даже снаружи (в моем случае) подключиться к экземпляру.
Обе ниже разрешения будут работать, если вы привяжете MySQL к 0.0.0.0:
[email protected]_NAME_OR_IP
[email protected]
Ответ 7
В моем случае
-
Измените конфигурацию mysql удаленного компьютера на /etc/mysql/my.cnf
: change
bind-address = 127.0.0.1
в
#bind-address = 127.0.0.1
-
На удаленном компьютере измените права пользователя mysql с помощью
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';
-
ВАЖНО: перезапустите mysql на удаленном компьютере: sudo /etc/init.d/mysql restart
Ответ 8
Для меня решение заключалось в том, чтобы изменить в файле conf mysql server параметр bind-address = "127.0.0.1" или bind-address = "x.x.x.x" на bind-address = "0.0.0.0".
Спасибо.
Ответ 9
Если у вас возникла проблема с набором контейнеров Docker, убедитесь, что вы не только EXPOSE
порт 3306
, но также сопоставляете порт со стороны контейнера -p 3306:3306
. Для docker-compose.yml
:
version: '2'
services:
mdb:
image: mariadb:10.1
ports:
- "3306:3306"
…
Ответ 10
Это случается (в моем случае), когда для MySQL недостаточно памяти. Перезапуск исправляет его, но если этот случай рассматривает nachine с большим объемом памяти или ограничивает память, полученную jvms
Ответ 11
Перейдите в службы Windows на панели управления и запустите службу MySQL. Для меня это сработало. Когда я выполнял проект Java EE, я получил эту ошибку "Ошибка связи". Я перезапустил свою систему, а потом сработал.
После этого я снова получил ту же ошибку даже после перезагрузки моей системы. Затем я попытался открыть консоль командной строки MySQL и войти в систему с помощью root, даже тогда это дало мне ошибку.
Наконец, когда я запустил службу MySQL из служб Windows, она сработала.
Ответ 12
Было то же самое.
Удаление порта помогло в моем случае, поэтому я оставил его как jdbc: mysql://localhost/
Ответ 13
Если вы используете спящий режим, эта ошибка может быть вызвана тем, что для открытия объекта сеанса больше времени, чем wait_timeout
Я зарегистрировал случай в здесь для тех, кто заинтересован.
Ответ 14
Я нашел решение
поскольку MySQL нужен для работы в Localhost.
перейдите в файл /etc/network/interfaces и убедитесь, что у вас установлена локальная конфигурация:
auto lo
iface lo inet loopback
СЕЙЧАС RESTART подсистему Networking и службы MySQL:
sudo/etc/init.d/networking restart
sudo/etc/init.d/mysql restart
Попробуйте сейчас
Ответ 15
Это в основном из-за слабой связи между клиентом mysql и удаленным сервером mysql.
В моем случае это из-за flaky VPN-соединения.
Ответ 16
В опции драйвера phpstorm + vagrant autoReconnect помогли.
Ответ 17
Решение, предоставленное Soheil, было успешным в моем случае.
Чтобы уточнить, единственное изменение, которое мне нужно было сделать, это конфигурация сервера MySQL;
bind-address = **INSERT-IP-HERE**
Я использую внешний MySQL-сервер для своего приложения. Это базовая установка Debian 7.5 с MySQL Server 5.5 - настройка по умолчанию.
ВАЖНО:
Всегда создавать резервные копии файлов конфигурации, которые вы можете изменить. Всегда будьте осторожны, когда вы становитесь суперпользователем.
Файл
/etc/mysql/my.cnf
Линия
bind-address = 192.168.0.103 #127.0.0.1
Перезапустите службу MySQL Server:
/usr/sbin/service mysql restart
Как вы можете видеть, я просто предоставил сетевой IP-адрес сервера и закомментировал запись по умолчанию. Обратите внимание, что просто скопировать и вставить мое решение не сработает для вас, если только каким-то чудом наши хосты не будут иметь один и тот же IP-адрес.
Спасибо @Soheil
Ответ 18
У меня возникла аналогичная проблема, и решение для моего случая было
- change bind-address = 0.0.0.0 от 127.0.0.1
- изменение url localhost на localhost: 3306
вещь, которую я чувствовал, мы никогда не должны сдаваться, я пробовал все варианты с этой должности и с других форумов, а также... happy it works @saurab
Ответ 19
Я тоже столкнулся с этой проблемой.
Как предложил Сохейл,
Я отправился в файл php.ini по пути C:\windows\php.ini, затем я пересмотрел номер порта в этом файле.
он находится в строке mysqli.default_port =..........
Итак, я изменил его в своем приложении java, как и в файле php.ini, теперь он отлично работает со мной.
Ответ 20
Я знаю, что это старый поток, но я пробовал много вещей и исправил свою проблему, используя следующие средства.
Я разрабатываю кросс-платформенное приложение для Windows, но для использования на серверах Linux и Windows.
База данных MySQL, называемая "jtm", установлена в обеих системах. По какой-то причине в моем коде у меня было имя базы данных как "JTM". В Windows это работало нормально, ведь на нескольких системах Windows он летал.
В Ubuntu я снова и снова получал ошибку. Я проверил его с правильным кодом в коде "jtm", и он работает.
Linux, очевидно, намного менее прощает вопрос чувствительности к регистру (справедливо), тогда как Windows делает скидку.
Теперь я чувствую себя немного глупо, но все проверю. Сообщение об ошибке не лучший, но это, кажется, поправимо, если вы упорно и получить все правильно.
Ответ 21
Я только что перезапустил MySQL (после подсказки отсюда: fooobar.com/questions/46259/...), и он решил проблему.
У меня была такая же проблема на MacOS (10.10.2) и MySql (5.6.21), установленном через homebrew.
Сбивчивая вещь заключалась в том, что одно из моих приложений прекрасно подключилось к базе данных, а другое - нет.
После многих попыток приложения, которое исключило исключение com.mysql.jdbc.CommunicationsException, как было предложено принятым ответом на этот вопрос, ничего не получилось, я был удивлен, что перезагрузка MySQL сработала.
Причиной моей проблемы могло быть следующее, как было предложено в ответе в вышеупомянутой ссылке:
Используете ли вы пул соединений? Если да, попробуйте перезапустить сервер. Вероятно, несколько соединений в вашем пуле соединений находятся в закрытом состоянии.
Ответ 22
Для Windows: -
Откройте меню "Пуск", напишите "Мастер настройки экземпляра MySqlserver" и перенастройте экземпляр сервера mysql.
Надеюсь, что это решит вашу проблему.
Ответ 23
После нескольких лет, имеющих такую же проблему и без постоянного решения, это то, что разрешило ее в течение последних 3 недель (что является записью с точки зрения безошибочной работы).
установить глобальный wait_timeout = 3600;
установить global interactive_timeout = 230400;
Не забудьте сделать это постоянным, если оно работает для вас.
Ответ 24
В моем случае (я noob), я тестировал Servlet, делающий подключение к базе данных с MySQL, и одно из исключений - это упомянутое выше.
Это заставило мою голову качаться несколько секунд, но я понял, что это потому, что я не запустил свой сервер MySQL в localhost
.
После запуска сервера проблема была исправлена.
Итак, проверьте, правильно ли работает сервер MySQL.
Ответ 25
Если вы используете локальный эмулятор, вам нужно использовать IP-адрес 10.0.2.2 вместо localhost для доступа к локальному серверу MySQL.