通过 ssh tunnel 连接 远程mysql数据库

场景:远程MySQL 数据库 因为种种原因,本地不能直接连接到该数据库。但是,数据库服务器A与本地机器B间的另外一台机器C可以连上。这样的话,我们可以在C上设置SSH tunnel 来访问MySQL数据库。

通过navicat等工具连接MySQL的方法在网上有很多资料这里不再赘述。这里要说的是 ——如何实现将数据库服务器A上的3306端口绑定到本地B,然后来访问本地B端口,就像访问数据库服务器A上3306端口一样。

依赖包:jsch-0.1.53.jar (作用:将A机器上的3306端口绑定到本地)

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class testSSHTunnel {
public static void main(String[] args) {

        Connection conn = null;
        Statement statement = null;
        ResultSet resultSet = null;
        ///

        String sshUser = ""; //机器C上SSH tunnel username
        String sshPass = "";  //机器C上SSH tunnel password
        int sshPort = 22;  //机器C上SSH tunnel port
        String sshHost = ""; //机器C的外网IP

        //创建SSH回话
        Session session = new JSch().getSession(sshUser, sshHost, sshPort);
        session.setPassword(sshPass);

        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();

        //将数据库服务器A上的端口绑定到本地B

        int localPort = 3306;
        String remoteHost = "";  //数据库服务器A的内网IP
        int remotePort = 3306;

        try {
            boolean flag = session.setPortForwardingL(localPort, remoteHost, remotePort);
            if (!flag) {
                System.out.println("SSHUtil 绑定端口失败");
                return;
            }
        } catch (JSchException e) {
            System.out.println("SSHUtil 绑定端口异常  ==>" + e.getMessage());
        }

        //以上已经将数据库端口绑定到本机3306端口
        //连接本地3306端口
        try {  
            Class.forName("com.mysql.jdbc.Driver");  
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/DB_INSTANCE", "DB_USERNAME", "DB_PASSWD");  
            statement = conn.createStatement();  
            String sql = "select xxx from xxx where xxx";  
            resultSet = statement.executeQuery(sql);  
            while (resultSet.next())  
                System.out.println(resultSet.getString(1));  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            try {
                resultSet.close();
                statement.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            sshSession.disconnect();
        } 
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值