springboot+ssh连接mysql
情景:
项目和数据库不在同一个服务器上,并且不在同一局域网下,可以通过ssh通道方式去连接mysql数据库
连接方式:
在本机创建一个ssh连接,连接到ssh server服务器,然后可以发送数据库操作的指令,指令会被ssh server服务器转发到目标数据库上
前提:
目标数据库可以通过 可视化工具+ssh 连接通道正常连接
SSH通道:
mysql:
SpringBoot项目代码
引入所需的依赖:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
java代码:
java的ssh连接工具配置类
package com.hdcmanager.hdc.hops.utils.ssh;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class SSHConnection {
String user = "linux服务登录名";// 服务器登录名
String password = "linux密码";// 登陆密码
String host = "公网IP"; // 服务器公网IP
int port = 22; // 跳板机ssh开放的接口,ssh通道端口 默认端口 22
int local_port = 3307; // 这个是本地的端口,选取一个没有占用的port即可
String remote_host = "数据库所在的服务器ip";// 要访问的mysql所在的ip
int remote_port = 3306;// 服务器上数据库端口号
Session session = null;
/**
* 建立SSH连接
*/
public void SSHConnection() throws Exception{
try {
JSch jsch = new JSch();
session = jsch.getSession(user, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
session.setPortForwardingL(local_port, remote_host, remote_port);
} catch (Exception e) {
// do something
}
}
/**
* 断开SSH连接
*/
public void closeSSH () throws Exception
{
this.session.disconnect();
}
}
java的监听类:
package com.hdcmanager.hdc.hops.utils.ssh;
import org.springframework.stereotype.Component;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
@Component
public class MyContextListener implements ServletContextListener {
private SSHConnection conexionssh;
public MyContextListener() {
super();
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// 建立连接
try {
conexionssh = new SSHConnection();
conexionssh.SSHConnection();
System.out.println("成功建立SSH连接");
} catch (Throwable e) {
System.out.println("SSH连接失败!");
e.printStackTrace();
}
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// 断开连接
System.out.println("Context destroyed ... !\n\n\n");
try {
conexionssh.closeSSH(); // disconnect
System.out.println("\n\n\n成功断开SSH连接!\n\n\n");
} catch (Exception e) {
e.printStackTrace();
System.out.println("\n\n\n断开SSH连接出错!\n\n\n");
}
}
}
配置文件:
spring.datasource.url=jdbc:mysql://127.0.0.1:3307/hdc_manager?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=数据库名
spring.datasource.password=数据库密码
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.test-while-idle=true
# 127.0.0.1:3307 本机的3307端口,不需改动,和ssh工具类的local_port对应起来
一共三步
- SSH工具配置类
- 监听类
- 配置文件
配置完之后,直接使用即可,如若发生更改,只需要修改SSH工具配置类即可