У меня есть приложение Java, которое работает на моей рабочей машине, но не подключается к производственному серверу.
Вот код подключения:
String db = "jdbc:mysql://localhost:3306/"+database+
"?zeroDateTimeBehavior=convertToNull";
connect = DriverManager.getConnection(db, username, password);
Где имя пользователя, имя базы данных и пароль установлены правильно. При беге получаю:
com.mysql.jdbc.exceptions.jdbc4.CommunicationException: Communications link failure
Я думаю, это связано с моей настройкой iptables. Когда я telnet localhost 3306, мое соединение отклоняется; однако, когда я подключаюсь через Telnet к серверу с другой машины через порт 3306, я могу подключиться (сервер принимает удаленные подключения по локальной сети). Это нормальное поведение?
Я бы подумал, что соединения localhost будут работать по умолчанию, но, видимо, нет. На сервере запущен debian btw. Есть идеи, что здесь не так, и как я могу это исправить?
Ура.
Редактировать:
После временного сброса настроек iptables я начинаю сомневаться, что именно в этом проблема, и это может быть связано с конфигурацией mysql.
Адрес привязки в my.cnf установлен на IP-адрес сервера, а не на 127.0.0.1. Я могу telnet с локального компьютера, используя IP, но все еще не могу подключиться к нему с помощью JDBC. Из того, что я могу сказать, mysql может иметь только один адрес привязки. Возможно, мне нужно что-то настроить в настройке mysql ...
Если он работает на другом сервере, то на этом сервере размещается база данных mysql. Ваша строка подключения должна ссылаться на нее, а не на localhost.
Команда netstat -lnt | grep 3306 'сообщит вам, запущен ли mysql и прослушивает ли его порт. Если он прослушивает только «127.0.0.1», вам нужно будет запустить приложение Java на том же сервере или туннелировать соединение. Если он прослушивает только адрес, отличный от 127.0.0.1, попробуйте заменить localhost этим адресом.
Изменить: из того, что я вижу, ваша конфигурация mysql должна быть хорошей. Проверьте порт, чтобы увидеть, не был ли он перемещен в нестандартный порт. Есть два местоположения, где определен порт, поэтому проверьте оба. Чтобы узнать, слушает ли он, выполните приведенную выше команду netstat. Если он не слушает, вы не сможете подключиться. Debian по умолчанию должен прослушивать TCP-адрес localhost: 3306.
Обычно разрешены удаленные подключения. Чтобы включить его, измените адрес прослушивания на 0.0.0.0 в конфигурации mysql и перезапустите.
я использую DBVisualizer для просмотра баз данных. Это приложение Java, которое использует JDBC для доступа к базам данных. Он обеспечивает достаточно хорошие выходные данные при сбое подключения, поэтому вы можете попробовать его. Сначала используйте базовую строку подключения без параметров. Затем добавьте свой вариант даты, чтобы увидеть, не в этом ли проблема.
Безопасность входа в MySQL может включать исходные хосты в дополнение к пользователю и паролю, поэтому вход в систему может завершиться ошибкой по этой причине. Пароли могут различаться в зависимости от происхождения.
Ваш MySQL может быть настроен специально для прослушивания только одного IP-адреса. Также обратите внимание, что localhost
имеет особое значение в некоторых, если не в большинстве клиентов MySQL: это означает использование сокета UNIX на коробке. Адрес 127.0.0.1
будет использовать настоящее TCP-соединение, попробуйте это.
Если вы все еще подозреваете iptables: iptables -L
позволит вам увидеть текущий набор правил.
Изменить: если ваш MySQL настроен для прослушивания определенного адреса, вы, скорее всего, можете заставить его прослушивать все адреса, заставив его слушать 0.0.0.0
.
Edit2: или просто удалив параметр из config.
Большинство дистрибутивов Linux по умолчанию при установке MySQL по умолчанию MySQL использует не сетевое соединение, а сокет.
Обычно это вызов файла /etc/my.cnf. Найдите там строку, в которой есть следующее, и закомментируйте ее: skip-network
После того, как вы закомментируете это, перезапустите MySQL, и вы сможете без проблем подключиться.