Java程序连接到远程MySQL数据库(运行ssh服务器)

时间:2017-08-15 06:36:53

标签: java mysql ssh

我想开发一个java swing应用程序。其中,MySQL数据库只存储在一台PC上。并且该软件可以从任何地方访问该数据库。 我是这种类型的JDBC连接的新手。 所以,我正在寻找创建这种远程连接的可能方法。 所以我得到了以下可能的解决方案:

1)我可以在网络上托管该数据库。所以这对我有用。我试图在 freesqldatabase.com 上托管我的数据库,它允许远程数据库连接。

2)我听说过ssh隧道。这个话题对我来说也是新的。 所以,首先我在具有MySQL数据库的PC上创建了ssh服务器。 所以,这台电脑目前正在运行ssh服务器。 然后我在客户端机器上尝试使用putty软件连接到我的ssh服务器。和它的工作。我可以通过ssh隧道访问客户端机器。

所以我的远程连接正在运行。 但我想从客户端计算机执行JDBC连接。连接到正在运行的具有db。

的计算机

我熟悉使用IP地址的数据库连接, 等,

String url = "jdbc:mysql://server ip address/databaseName";
           Class.forName ("com.mysql.jdbc.Driver");
           conn = DriverManager.getConnection (url,"username","password");

那么请告诉我,关于Java编程中的ssh连接? 如何从客户端PC连接到服务器(具有ssh运行和MySQL数据库的PC)?

提前完成。

2 个答案:

答案 0 :(得分:0)

JSch正是您要找的。

此库正在执行与您相同的操作,将本地计算机隧道连接到远程计算机。 JSch将启动隧道,jdbc将通过JSch设置连接。

这是here的示例。

package com.journaldev.java.ssh

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.sql.Connection;


public class MySqlConnOverSSH {

    /**
     * Java Program to connect to remote database through SSH using port forwarding
     * @author Pankaj@JournalDev
     * @throws SQLException 
     */
    public static void main(String[] args) throws SQLException {

        int lport=5656;
        String rhost="secure.journaldev.com";
        String host="secure.journaldev.com";
        int rport=3306;
        String user="sshuser";
        String password="sshpassword";
        String dbuserName = "mysql";
        String dbpassword = "mysql123";
        String url = "jdbc:mysql://localhost:"+lport+"/mydb";
        String driverName="com.mysql.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();
            }
        }
    }

}

我从来没有这样做但我只是配置我的本地机器在机器启动时开始隧道连接到远程服务器。

答案 1 :(得分:0)

理解起来非常简单,当您与数据库服务器通信时,您需要拥有服务器的地址(即IP地址)和端口号,因为计算机上的每个应用程序都使用特定的端口进行通信。

现在,因为您需要访问部署在其他服务器上的应用程序的数据库。您需要在网络上部署应用程序和数据库,以便它们可以使用IP地址和端口号进行通信。

对于您的测试,您可以使用LAN。你可以在局域网内有两台机器并为它们分配一些IP地址,然后使用数据库服务器ip地址创建JDBC连接。

我真的不知道在你的情况下使用隧道。当事情可以轻松完成时,你为什么要尝试复杂或未知的方法?