CommunicationsException:连接到MySQL数据库

时间:2016-05-02 19:31:26

标签: java mysql sockets jdbc ssh

所以我创建了一个到我的远程MySQL服务器的SSH连接。我能通过shell做ssh -v user @ host,所以我知道我的主机ip,用户名和密码是正确的。

这是我用来做的代码:

    int lport=5656;
    String rhost="host";
    String host="host";
    int rport=3306;
    String user="root";
    String password="pass";
    String dbuserName = "root";
    String dbpassword = "pass";
    String url = "jdbc:mysql://localhost:"+lport+"/lg4";
    String driverName="com.mysql.cj.jdbc.Driver";
    Connection conn = null;
    Session session= null;
    try{
        //Set StrictHostKeyChecking property to no to avoid UnknownHostKey issue
        java.util.Properties config = new java.util.Properties(); 
        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();
        session=jsch.getSession(user, host, 22);
        session.setPassword(password);
        session.setConfig(config);
        session.connect();
        System.out.println("Connected");
        int assinged_port=session.setPortForwardingL(lport, rhost, rport);
        System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);
        System.out.println("Port Forwarded");

        //mysql database connectivity
        Class.forName(driverName).newInstance();
        conn = DriverManager.getConnection (url, dbuserName, dbpassword);
        System.out.println ("Database connection established");
        System.out.println("DONE");
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        if(conn != null && !conn.isClosed()){
            System.out.println("Closing Database Connection");
            conn.close();
        }
        if(session !=null && session.isConnected()){
            System.out.println("Closing SSH Connection");
            session.disconnect();
        }
    }
}

控制台播放了这个:

System.out.println中的“Port Forwarded”(“Port Forwarded”);

所以我知道它确实是前进的,问题出在这一行:

     conn = DriverManager.getConnection (url, dbuserName, dbpassword);

错误是:

CommunicationsException:通讯链接失败

所以我开始尝试为这个问题找到解决方案,我遇到了一个可能的解决方案和问题列表:

  1. JDBC URL中的IP地址或主机名错误。
  2. 本地DNS服务器无法识别JDBC URL中的主机名。
  3. JDBC URL中缺少或错误端口号。
  4. 数据库服务器已关闭。
  5. 数据库服务器不接受TCP / IP连接。
  6. 数据库服务器已用完连接。
  7. Java和DB之间的某些东西阻止了连接,例如防火墙或代理。
  8. 好的,所以我开始一个接一个地缩小问题范围:

    1. 我知道我的IP是正确的,因为我能够通过shell访问它并且它确实是前向端口。
    2. 与一个相同
    3. 我将端口I端口转发到本地主机,因此我怀疑这是问题。
    4. 服务器没有关闭,我甚至重新启动以确保一切正常。
    5. 我配置了MySQL,注释#bin-address,我无法评论跳过网络,因为bin-address现在是默认值。
    6. 这是怎么发生的?我不知道这个。
    7. 我的防火墙已关闭。
    8. 我可以做错什么?

1 个答案:

答案 0 :(得分:0)

请用你的网址中的ip替换localhost。这可能会有所帮助 比如String url = "jdbc:mysql://yourIp:"+lport+"/lg4";