JDBC не может подключиться к MySQL за NAT с переадресацией портов
Эта проблема была решена. Вот список, за которым я следовал, чтобы проверить ошибку "Отказано в соединении".
- MySQL статус сервера
- Это работает?
- --Skip-сеть отключена?
- Связывает ли он с адресом 0.0.0.0?
- Служба заблокирована каким-либо брандмауэром?
- Вызывало ли оно какую-либо ошибку / предупреждение / предупреждение в своих лог-файлах?
- Статус клиента
- Вы можете добраться до сервера IP / URL?
- вы можете telnet сервер с портом?
- Вы можете войти в службу MySQL, используя другое клиентское программное обеспечение MySQL на той же машине через тот же сетевой маршрут?
- проверьте настройки брандмауэра
- проверьте MySQL разъем / драйвер!
Ответ на вопрос кажется глупым: я использовал устаревший драйвер mysql ( 5.1.9, последняя версия 5.1.32).
Тем не менее, я не знаю, почему старая версия не работает.
Я устанавливаю сервер mysql на виртуальной машине, размещенной на virtualbox, и могу успешно подключиться к нему на хост-компьютере с помощью клиента командной строки mysql или с помощью инструмента mysql.
Но я просто не могу подключиться к нему через mysql jdbc разъем с тем же ip и портом.
Я подключил хост и виртуальную машину с помощью nat и переадресовал порт 3306 сервера mysql к порту 9936 хоста.
код Java, который я использовал для проверки соединения:
String url = "jdbc:mysql://127.0.0.1:9936/test";
Class.forName ("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(url, "usr", "pwd");
это ошибка:
Exception in thread "main" 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.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
Это действительно странно, потому что я могу успешно подключиться к нему через telnet и подключиться к нему с помощью любого клиента mysql, который я смог найти, но код java просто не работает!
Обновление 2014 09 30
Я пробовал следующие шаги, не работает:
- отключить брандмауэры на хост-компьютере и клиентском компьютере
- привязать адрес службы mysql к 0.0.0.0
- убедитесь, что mysql НЕ пропускает сеть
- убедитесь, что учетная запись для подключения к mysql включена и предоставлена в домене '%'
вот текущий статус:
настройки виртуальной коробки:
Я могу успешно подключиться к нему с помощью клиента MySQL:
Но простые коды JDBC вызывают ошибку:
добавить доказательство:
mysql-connector-java 5.1.9:
mysql-connector-java 5.1.32:
1 ответ
У меня есть MariaDB в ArchLinux VM (хост - Windows 8.1), выдержка конфигурации /etc/mysql/my.cnf
Для работы в сети следует:
#skip-networking
bind-address = 0.0.0.0
Это моя конфигурация VirtualBox NAT:
Я также предоставил права удаленного подключения:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION
С этой настройкой я могу подключиться с помощью клиентов MySQL с хоста на порт 9936.
Это моя сборка:
apply plugin: 'java'
apply plugin: 'application'
mainClassName = "Main"
repositories {
mavenCentral()
}
dependencies {
runtime 'mysql:mysql-connector-java:5.1.32'
}
Это мое Main.java
в корневом пакете:
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
try {
String url = "jdbc:mysql://127.0.0.1:9936/test";
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(url, "root", null);
System.out.println("Connection successful!");
} catch(Throwable t) {
t.printStackTrace();
}
}
}
Запуск его с хоста с gradle run
производит:
Connection successful!
Можете ли вы воспроизвести такую успешную ситуацию, используя точно такую же настройку? Разрешено ли Java использовать сетевые подключения (например, приложениями брандмауэра)?