Невозможно подключиться к mysql через JDBC-коннектор через Tomcat или внешне


17

Я установил стандартную установку mysql 5.5, и хотя я могу подключиться к службе mysql с помощью команды mysql, и служба, похоже, работает, я не могу подключиться к ней через spring + tomcat или через внешний разъем jdbc.

Я использую следующий URL:

jdbc:mysql://myserver.com:myport/mydb

с правильным именем пользователя / паролем, но я получаю следующее сообщение:

server.com: 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.
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

Кажется, это та же проблема, что и при попытке подключиться извне.


Я столкнулся с этой проблемой при попытке подключиться через Java к моей базе данных MySQL, которая работает на другом сервере в моей локальной сети. при выполнении той же Java-программы на сервере, который запускает mysql, он подключался без проблем. с внешней машины я мог подключиться к базе данных mysql, например, с помощью SQLYog (хотя сначала мне пришлось изменить файл my.cnf для привязки к 0.0.0.0 вместо 127.0.0.1). Ответ Бодена и комментарий об изменении разъема JDBC указали мне правильное направление. Я изменил разъем JDBC на последнюю версию, и вдруг это сработало!
— user2380870

Ответы:


18

Это может произойти по разным причинам. Я сам видел это несколько недель назад, но не могу вспомнить, что для меня было исправлением.

1) Убедитесь, что адрес, к которому привязан mysql, вероятно, 127.0.0.1 (только), который, по моему мнению, является значением по умолчанию (по крайней мере, на стандартном сервере Ubuntu). Вам нужно закомментировать параметр bind-address в my.cnf, чтобы связать все доступные адреса (вы не можете выбрать несколько, это один или все).

2) Если он привязан к 127.0.0.1 и вы не можете подключиться с помощью «localhost», убедитесь, что он не разрешается по адресу localhost IPv6 вместо IPv4. (или просто используйте IP-адрес)

3) Дважды и трижды проверьте порт, который прослушивает mysql.

4) Убедитесь, что вы используете правильный разъем JDBC для вашего JDK.

5) Убедитесь, что вы не делаете что-то действительно глупое, как запуск mysql с --skip-network.

Я думаю, что мое первое предложение имеет наибольшее обещание ... на самом деле, я думаю, что именно там я видел это недавно ... Я пытался подключиться к mysql удаленно (также в Ubuntu 8.04).


Просто чтобы добавить мой 2cent, 4-й работал для меня. Благодарность!
— Янис Пейзениекс,

1
Что касается «Вам нужно закомментировать параметр bind-address в my.cnf для привязки ко всем доступным адресам», по умолчанию теперь используется прослушивание только на localhost, поэтому вам может потребоваться использовать строку «bind-address = 0.0. 0.0 "в пределах [mysqld].
— Пало

13

У меня была такая же проблема в двух моих программах. Моя ошибка была в следующем:

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/my.cnf

  • Windows: D: \ Program Files \ mysql \ bin \ my.ini

Вот решения:

  • изменение атрибута «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

Добавьте этот код в строку подключения:

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

Хотя ни одно из этих решений не помогло мне, я предлагаю вам попробовать их. Потому что некоторые люди решили свою проблему, выполнив следующие действия.

Но что решило мою проблему? Моя проблема была в том, что у меня было много SELECTs в базе данных. Каждый раз, когда я создал соединение, а затем закрыл его. Хотя я закрывал соединение каждый раз, но система столкнулась со многими соединениями и выдала мне эту ошибку. Что я сделал, так это то, что я определил свою переменную соединения как общедоступную (или приватную) переменную для всего класса и инициализировал ее в конструкторе. Затем каждый раз, когда я просто использовал это соединение. Это решило мою проблему, а также значительно увеличило мою скорость.

Вывод

Нет простого и уникального способа решения этой проблемы. Я предлагаю вам подумать о собственной ситуации и выбрать вышеуказанные решения. Если вы берете эту ошибку в начале программы и вообще не можете подключиться к базе данных, у вас может быть проблема в строке подключения. Но если вы возьмете эту ошибку после нескольких успешных взаимодействий с базой данных, проблема может заключаться в количестве соединений, и вы можете подумать об изменении «wait_timeout» и других настроек MySQL или переписать свой код так, чтобы это уменьшило количество соединений.


У меня тоже была эта проблема! Но я изначально изменил mysql для прослушивания порта 8888 вместо 3306. Итак, ответ @ sohail помог, я просто добавил порт 8888 в свой uri, и это сработало! Большое спасибо

Это решило проблему для меня! С нашей настройкой Vagrant Homestead он по какой-то причине связывался с адресом, данным виртуальной машине (в моем случае 10.0.2.15) вместо localhost.
— Ландер

1

Если вы используете установку Linux, у вас, вероятно, есть блокировка входящих сообщений lokkit, кроме как через SSH.

Войдите в систему как пользователь root и запустите команду lokkit из командной строки, отключите брандмауэр и SElinux и посмотрите, есть ли у вас такая же проблема.

Также проверьте, правильно ли установлены ваши разрешения, чтобы все могли писать в правильные места.


Я использую Ubuntu 8.04. Я, наверное, должен был упомянуть об этом. У вас есть конкретные инструкции для этого дистрибутива? Я сейчас погуглю, но сначала подумал.
— Стефан Кендалл

Отключение sudo ufw отключит брандмауэр Ubuntu
— Стивен Томпсон

Я установил UFW и попытался включить порт, но не играли в кости.
— Стефан Кендалл

UFW и Iptables уже были удалены. Я думал, что UFW был инструментом управления, который должен был быть установлен отдельно. Конечно же, «iptables» не выдает такой команды, и, похоже, не работает ни одна служба iptables.
— Стефан Кендалл

Хорошо, наконец то, что я часто обнаруживаю, это то, что вы не включаете mysql для прослушивания через интерфейс eth0, и часто это только для интерфейса localhost. Попробуйте следующее. Измените jdbc: mysql: //myserver.com: myport / mydb на jdbc: mysql: // localhost: myport / mydb, если это работает, вам нужно сделать следующее dev.mysql.com/doc/refman/5.1/en/ can-not-connect-to-server.html
— Стивен Томпсон,


1

Это также может быть вызвано неправильными настройками прокси . У меня была эта проблема при попытке подключиться через jdbc к экземпляру MySQL, работающему в виртуальном устройстве Parallels на моем Mac. Соединение jdbc использует сетевые настройки системного уровня, и, поскольку я был за прокси-сервером SOCKS, мне пришлось установить хост MySql в качестве хоста без прокси-сервера (например, на Mac вы можете настроить это в «Настройки-> Сеть-> Дополнительно-»). > Прокси и, наконец, добавьте имя хоста или IP-адрес в «Параметры обхода прокси для этих хостов и доменов»).


1

MySQL Connector / J поддерживает только TCP / IP. Java не поддерживает подключение к сокетам домена Unix.

Если MYSQL запускается с флагом пропуска сети или MySQL работает за брандмауэром, то опция TCP / IP отключена. Так что Java не может общаться с MySQL.


0

У меня была очень похожая проблема в течение почти дня, и это сводило меня с ума! но мне удалось найти решение, и это было очень, очень просто, вам просто нужно /etc/init.d/tomcat6 изменить TOMCAT6_SECURITY = yes на TOMCAT6_SECURITY = no. это не мое решение, я нашел его здесь , как вы можете видеть, я использую Ubuntu, надеюсь, это работает.


0

У меня такая же проблема. Изменено свойство "bind-address" в файле /etc/mysql/my.cnf на 0.0.0.0, и оно работает. Соответствующая строка в my.cnf выглядит так:

bind-адрес = 0.0.0.0

До этого был задан внешний IP-адрес сервера, поэтому он выглядел примерно так:

bind-address = 196.152.4.145

Я думаю, что когда он установлен на внешний IP-адрес, а не на цикл localhost, сервер mysql просто подключается к сетевой карте и не прослушивает соединения из локальной петли.


0

попробуйте свой локальный адрес, чтобы связать адрес в файле my.cnf

Соединение con = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://x62.xx8.x4x.x5:3306/mydb", "root", "root");
        try {
            System.out.println(con.getMetaData());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.