Невозможно подключиться к 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).

Boden
источник
Просто чтобы добавить мой 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 или переписать свой код так, чтобы это уменьшило количество соединений.

Soheil
источник
У меня тоже была эта проблема! Но я изначально изменил 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.

Sankar.lp.gym
источник
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();
    }
Озгун Байрак
источник