首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jdbc无法通过端口转发连接nat后的mysql。

jdbc无法通过端口转发连接nat后的mysql。
EN

Stack Overflow用户
提问于 2014-08-30 07:46:15
回答 1查看 3.5K关注 0票数 0

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

  1. MySQL服务器状态
    • 它在跑吗?
    • 是不是.跳过网络系统被禁用了?
    • 它是否绑定到地址0.0.0.0?
    • 该服务是否被防火墙阻塞?
    • 它是否在其日志文件中引发错误/警报/警告?

  1. 客户端状态
    • 你能到达服务器ip / url吗?
    • 你能用端口告诉服务器吗?
    • 您能否通过相同的网络路由在同一台机器上使用其他mysql客户端软件登录mysql服务?
    • 检查防火墙设置
    • 检查mysql连接器/驱动程序 !!

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

但我还是不知道为什么老版本不起作用。

我在virtualbox托管的虚拟机中安装了mysql服务器,我可以通过命令行mysql客户端或mysql工作台在主机中成功地连接到它。

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

我用nat连接主机和vm,并将mysql服务器的3306转发到主机的9936端口。

用于测试连接的java代码:

代码语言:javascript
复制
String url = "jdbc:mysql://127.0.0.1:9936/test";
Class.forName ("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(url, "usr", "pwd");

这是一个错误:

代码语言:javascript
复制
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. 将mysql服务地址绑定到0.0.0.0
  3. 确保mysql不会跳过网络。
  4. 确保启用要连接到mysql的帐户并在'%‘域上授予该帐户

以下是当前的状态:

virtualbox设置:

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

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

添加证据:

mysql连接器-java 5.1.9:

mysql-连接器-java 5.1.32:

EN

回答 1

Stack Overflow用户

发布于 2014-09-03 09:16:14

我在MariaDB VM中有ArchLinux (主机是Windows8.1),用于网络的配置节选/etc/mysql/my.cnf如下所示:

代码语言:javascript
复制
#skip-networking
bind-address = 0.0.0.0

这是我的VirtualBox NAT配置:

我还授予远程连接特权:

代码语言:javascript
复制
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION

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

这是我的等级建筑:

代码语言:javascript
复制
apply plugin: 'java'

apply plugin: 'application'
mainClassName = "Main"

repositories {
    mavenCentral()
}

dependencies {
    runtime 'mysql:mysql-connector-java:5.1.32'
}

这是根包中的Main.java

代码语言:javascript
复制
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从主机上运行它会产生:

代码语言:javascript
复制
Connection successful!

你能用这个完全相同的设置来再现这样一个成功的场景吗?Java是否允许使用网络连接(例如防火墙应用程序)?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25580210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档