Я установил стандартную установку 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", сделайте ее комментарий, добавив знак "#" в начале этой строки.
Добавьте эти строки в файл конфигурации 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.
"max_allowed_packet"- это переменная в файле конфигурации MySQL, которая указывает максимальный размер пакета, а не максимальное количество пакетов. Так что это не поможет решить эту ошибку.
изменить TOMCAT6_SECURITY = да на TOMCAT6_SECURITY = нет
используйте validationQuery = "select now ()", чтобы убедиться, что на каждый запрос есть ответы
Добавьте этот код в строку подключения:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
Хотя ни одно из этих решений не помогло мне, я предлагаю вам попробовать их. Потому что есть люди, которые решили свою проблему, выполнив эти шаги.
Но что решило мою проблему? Моя проблема заключалась в том, что у меня было много SELECT в базе данных. Каждый раз я создавал соединение, а затем закрывал его. Хотя я каждый раз закрывал соединение, но система сталкивалась со многими соединениями и выдавала мне эту ошибку. Что я сделал, так это то, что я определил свою переменную подключения как общедоступную (или частную) переменную для всего класса и инициализировал ее в конструкторе. Затем каждый раз я просто использовал это соединение. Это решило мою проблему, а также резко увеличило мою скорость.
Нет простого и однозначного способа решить эту проблему. Предлагаю вам подумать о своей ситуации и выбрать вышеперечисленные решения. Если вы возьмете эту ошибку в начале программы и вообще не можете подключиться к базе данных, у вас может быть проблема в строке подключения. Но если вы возьмете эту ошибку после нескольких успешных взаимодействий с базой данных, проблема может быть в количестве подключений, и вы можете подумать об изменении «wait_timeout» и других параметров MySQL или переписать свой код, чтобы это уменьшило количество подключений.
Если вы запускаете установку Linux, у вас, вероятно, есть локкит, блокирующий входящую связь, кроме как через SSH.
Войдите в систему как root и запустите команду lokkit из командной строки, отключите брандмауэр и SElinux и посмотрите, возникла ли у вас такая же проблема.
Также проверьте, что ваши разрешения установлены правильно, чтобы все могло записывать в правильные места.
Также есть эта огромная ошибка в версии 5.1.9 драйвера mysql-jdbc:
Это также может быть вызвано неправильным настройки прокси. У меня возникла проблема при попытке подключиться через 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();
}