Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaSSHMySQL连接_Java_Mysql_Ssh - Fatal编程技术网

JavaSSHMySQL连接

JavaSSHMySQL连接,java,mysql,ssh,Java,Mysql,Ssh,如何在Java代码中实现这一点 ssh -L 1234:localhost:3306 mysql.server.remote 我有一个Java桌面应用程序,数据库位于共享服务器(internet)中,可以从任何地方访问。使用该软件的人不会在前后打开终端执行命令,而是会使用该软件 因此,我需要一个解决方案,在应用程序启动时将应用程序与数据库连接起来,并在连接(conn.close()和ssh)关闭应用程序时终止连接。为此,所有这些(上面的代码)都应该在我的脚本中。。。这是我无法实现的 我使用了J

如何在Java代码中实现这一点

ssh -L 1234:localhost:3306 mysql.server.remote
我有一个Java桌面应用程序,数据库位于共享服务器(internet)中,可以从任何地方访问。使用该软件的人不会在前后打开终端执行命令,而是会使用该软件

因此,我需要一个解决方案,在应用程序启动时将应用程序与数据库连接起来,并在连接(conn.close()和ssh)关闭应用程序时终止连接。为此,所有这些(上面的代码)都应该在我的脚本中。。。这是我无法实现的

我使用了JSch,并且成功地创建了SSH隧道(在端口22上),但是没有连接MySQL的方法。。。任何帮助都可以

整个代码如下:

public static void main(String[] args) throws SQLException {

    String host="ssh.Mysite.com";
    String rhost="localhost";
    int rport=3306;
    int lport=4321;

    String user="userMysite.com";
    String password="passMysite.com";

    String dbuserName = "UserDB.com";
    String dbpassword = "PassDB.com";
    String url = "jdbc:mysql://localhost:3306/DB.com";
    String driverName="com.mysql.jdbc.Driver";
    Session session= null;

    try{
  //ssh tunnel creation          
        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();
        int assinged_port=session.setPortForwardingL(lport, rhost, rport);

  //mysql database connect                  
        Class.forName(driverName).newInstance();
        dbConn  = DriverManager.getConnection (url, dbuserName, dbpassword);

 String sql = "SELECT * FROM client ";      
     PreparedStatement ps = dbConn.prepareStatement(sql);
     ResultSet rs = ps.executeQuery();
            while (rs.next()){
                  System.out.println(rs.getString("name"));
            }

    }catch(JSchException e){
        e.printStackTrace();            
    }finally{
        if(dbConn != null && !dbConn.isClosed()){
            dbConn.close();
        }
        if(session !=null && session.isConnected()){
            session.disconnect();
        }
    }
}
出于测试目的,我编写了以下代码:

String url = "jdbc:mysql://localhost:3306";
String driverName="com.mysql.jdbc.Driver";
Class.forName(driverName);
Connection dbConn = DriverManager.getConnection (url, dbuserName, dbpassword); 

        try {
           ResultSet rs = dbConn.getMetaData().getCatalogs();
                        while (rs.next()) {
                            System.out.println("TABLE_CAT = " + rs.getString("TABLE_CAT") );
                        }           
         }catch(SQLException e){
                         e.printStackTrace(); 
         }
结果:

localhost:3306
=>打印计算机本地主机中的所有数据库

remote.server.mysql:3306
remote.server.mysql:4321
localhost:4321
=>错误

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。


谢谢大家!

能否尝试从Java运行ssh二进制文件?例如:

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("ssh -L 1234:localhost:3306 mysql.server.remote");

显然,这需要系统在路径中安装ssh。

您可以尝试从Java运行ssh二进制文件吗?例如:

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("ssh -L 1234:localhost:3306 mysql.server.remote");

显然,这需要系统在路径中安装ssh。

如何在代码中打开到mysql的连接?将其更改为
jdbc:mysql://mysql.server.remote:3306/remoteDB
dbConn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/remoteDB,dbuserName,dbpassword”);-创建隧道后连接的localhost:4321->localhost:3306端口转发com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications链接失败成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)关闭SSH连接如果在连接中使用远程服务器,则会出现错误:通信链路故障;如果我使用localhost,则会出现
错误:未知数据库“remoteDB”
如何在代码中打开到mysql的连接?将其更改为
jdbc:mysql://mysql.server.remote:3306/remoteDB
dbConn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/remoteDB,dbuserName,dbpassword”);-创建隧道后连接的localhost:4321->localhost:3306端口转发com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications链接失败成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)关闭SSH连接如果在连接中使用远程服务器,则会出现错误:通信链路故障;如果使用localhost,则会出现
错误:未知数据库“remoteDB”