gpt4 book ai didi

java - jdbc无法通过端口转发连接到nat后面的mysql

转载 作者:太空宇宙 更新时间:2023-11-03 12:08:03 27 4
gpt4 key购买 nike

这个问题已经解决了。这是我检查“连接被拒绝”错误所遵循的列表。

  1. MySQL 服务器状态
    • 它在运行吗?
    • 是否禁用了 --skip-networking ?
    • 它绑定(bind)到地址 0.0.0.0 吗?
    • 服务是否被任何防火墙阻止?
    • 它是否在其日志文件中引发任何错误/警报/警告?
  2. 客户状态
    • 你能找到服务器 ip/url 吗?
    • 你能用这个端口远程登录服务器吗?
    • 能否通过同一网络路由在同一台机器上使用其他mysql客户端软件登录mysql服务?
    • 检查防火墙设置
    • 检查 mysql 连接器/驱动程序 !!

这个问题的答案似乎很愚蠢:我使用了一个过时的mysql驱动程序(5.1.9,目前最新版本是5.1.32)。

我仍然不知道为什么旧版本无法正常工作。


我在由 virtualbox 托管的虚拟机中设置了一个 mysql 服务器,我可以使用命令行 mysql 客户端或 mysql workbench 在主机中成功连接到它。

但是我无法使用具有相同 IP 和端口的 mysql jdbc 连接器连接到它。

我用 nat 连接了主机和虚拟机,端口转发了 mysql 服务器的 3306 到主机的 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)

这真的很奇怪,因为我可以成功地远程登录到它并使用我能找到的任何 mysql 客户端连接到它,但是 java 代码就是不起作用!


2014年09月30日更新

我已经尝试了以下步骤,但没有成功:

  1. 在主机和客户端机器上禁用防火墙
  2. 绑定(bind)mysql服务地址为0.0.0.0
  3. 确保 mysql 不跳过网络
  4. 确保连接到 mysql 的帐户在“%”域上已启用并被授予

这是当前状态:

虚拟机设置: virtualbox settings

我可以使用 mysql 客户端成功连接到它: mysql client success

但是简单的 jdbc 代码会引发错误: jdbc error


添加证明:

mysql-connector-java 5.1.9: Error with 5.1.9

mysql-connector-java 5.1.32: Success with 5.1.32

最佳答案

我在 ArchLinux VM(主机是 Windows 8.1)中有 MariaDB,网络配置摘录 /etc/mysql/my.cnf 如下:

#skip-networking
bind-address = 0.0.0.0

这是我的 VirtualBox NAT 配置:

enter image description here

我还授予了远程连接权限:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION

通过此设置,我可以使用主机的 MySQL 客户端在端口 9936 上进行连接。

这是我的 gradle 构建:

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 使用网络连接(例如通过防火墙应用程序)?

关于java - jdbc无法通过端口转发连接到nat后面的mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25580210/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com