Java SSH MySQL 连接 [英] Java SSH MySQL connection

查看:52
本文介绍了Java SSH MySQL 连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何在 Java 代码中实现它?

How can I implement this in Java code?

ssh -L 1234:localhost:3306 mysql.server.remote

我有一个 Java 桌面应用程序,数据库位于共享服务器(互联网)中,可以从任何地方访问.会用软件的小伙伴不会开终端执行命令前后会用软件...

I have a Java desktop application with the database in a shared server (internet) to be accessible from everywhere. The guys that will use the software will not open terminals to execute commands before and after will use the software...

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

So I need a solution to connect my application with the database when the application starts and kill the connections (conn.close(), and ssh) when they will close the application. For that, all this (the code above) should be inside my script... And this is what i cannot achieve...

我使用了 JSch,并且成功创建了 SSH 隧道(在端口 22 上),但无法连接 MySQL...欢迎任何帮助.

I've used JSch, and I successfully create the SSH tunnel (on port 22), but no way to connect MySQL... Any help it's welcome.

这里的全部代码:

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();
        }
    }
}

出于测试目的,我编写了以下代码:

For test purposes i made the following code:

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 => 打印我电脑本地主机中的所有数据库;

localhost:3306 => Print me all the databases in my computer's localhost;

remote.server.mysql:3306 or remote.server.mysql:4321 or localhost:4321 => ERROR

remote.server.mysql:3306 or remote.server.mysql:4321 or localhost:4321 => ERROR

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败最后一个成功发送到服务器的数据包是 0 毫秒前.驱动程序没有收到来自服务器的任何数据包.

谢谢!

推荐答案

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

Could you try running ssh binary from Java? For example:

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

显然,这需要系统在 PATH 中安装 ssh.

Obviously, that requires a system to have ssh installed in a PATH.

这篇关于Java SSH MySQL 连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆