Назад | Перейти на главную страницу

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

Я установил стандартную установку 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)

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

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

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).

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

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, вы можете обратиться к следующему not:

  • Linux: /etc/my.cnf

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

Вот решения:

  • изменение атрибута "адрес привязки"

Раскомментируйте атрибут "адрес привязки" или измените его на один из следующих IP-адресов:

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

  • изменить безопасность Tomcat

изменить TOMCAT6_SECURITY = да на TOMCAT6_SECURITY = нет

  • использовать свойство validationQuery

используйте validationQuery = "select now ()", чтобы убедиться, что на каждый запрос есть ответы

  • AutoReconnect

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

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

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

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

Вывод

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

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

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

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

Также есть эта огромная ошибка в версии 5.1.9 драйвера mysql-jdbc:

http://bugs.mysql.com/bug.php?id=47494

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

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

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

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

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

привязка-адрес = 0.0.0.0

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

привязка-адрес = 196.152.4.145

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

попробуйте свой локальный адрес для привязки адреса в файле 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();
    }