JDBC не может подключиться к MySQL за NAT с переадресацией портов

Эта проблема была решена. Вот список, за которым я следовал, чтобы проверить ошибку "Отказано в соединении".

  1. MySQL статус сервера
    • Это работает?
    • --Skip-сеть отключена?
    • Связывает ли он с адресом 0.0.0.0?
    • Служба заблокирована каким-либо брандмауэром?
    • Вызывало ли оно какую-либо ошибку / предупреждение / предупреждение в своих лог-файлах?
  2. Статус клиента
    • Вы можете добраться до сервера 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

Я пробовал следующие шаги, не работает:

  1. отключить брандмауэры на хост-компьютере и клиентском компьютере
  2. привязать адрес службы mysql к 0.0.0.0
  3. убедитесь, что mysql НЕ пропускает сеть
  4. убедитесь, что учетная запись для подключения к mysql включена и предоставлена ​​в домене '%'

вот текущий статус:

настройки виртуальной коробки: настройки виртуальной коробки

Я могу успешно подключиться к нему с помощью клиента MySQL:MySQL клиент успеха

Но простые коды JDBC вызывают ошибку:ошибка JDBC


добавить доказательство:

mysql-connector-java 5.1.9:Ошибка с 5.1.9

mysql-connector-java 5.1.32:Успех с 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 использовать сетевые подключения (например, приложениями брандмауэра)?

Другие вопросы по тегам