场景:远程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();
}
}
}