Spring Boot通过SSL远程连接Mysql

时间:2018-01-23 09:01:16

标签: mysql spring spring-mvc spring-boot ssh

我有一个远程MySQL数据库服务器,需要与我本地运行的Spring Boot应用程序连接。

在Spring Boot Applications加载之前,它以与远程服务器的ssh隧道开始。

这是首先创建的主应用程序代码,然后启动ssh tunnel然后启动主应用程序。

public class XXXCoreApplication {

public static void main(String[] args) throws SQLException {
    Connection connection = null;
    Session session = null;

    String host = "XX.XXX.XX.XXX";
    String servUser = "user";
    String servPwd = "pass";
    int port = 22;

    String rhost = "localhost";
    int rport = 3306;
    int lport = 3307;

    String driverName = "com.mysql.jdbc.Driver";
    String db2Url = "jdbc:mysql://localhost:" + lport + "/xxx_core";
    String dbUsr = "MT";
    String dbPwd = "****";

    try {
        JSch jsch = new JSch();
        // Get SSH session
        session = jsch.getSession(servUser, host, port);
        session.setPassword(servPwd);
        java.util.Properties config = new java.util.Properties();
        // Never automatically add new host keys to the host file
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        // Connect to remote server
        session.connect();
        // Apply the port forwarding
        session.setPortForwardingL(lport, rhost, rport);
        // Connect to remote database
        Class.forName(driverName);
        connection = DriverManager.getConnection(db2Url, dbUsr, dbPwd);
        System.out.println("Connection to database established!");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (connection != null && !connection.isClosed()) {
            connection.close();
        }
        if (session != null && session.isConnected()) {
            session.disconnect();
        }
    }
    SpringApplication.run(XXXCoreApplication.class, args);
}

}

但是我的application.properties文件是空的,可能是失败点。

它给了我一个空的application.properties:

的错误
  

“无法确定数据库类型的嵌入式数据库驱动程序类   NONE“

我应该给application.properties中的spring.datasource.url值什么?还是其他任何建议?感谢。

1 个答案:

答案 0 :(得分:1)

您正在关闭finally块中的SSH隧道。

我建议您也让Spring创建SSH隧道,而不是在main方法中创建它。这将允许您为不同的环境选择性地启用/禁用隧道,并且您可以使用属性和其他Spring Boot功能来配置,启动和停止隧道。

这样的事情会起作用。

public class SshTunnelStarter {

    @Value("${ssh.tunnel.url}")
    private String url;

    @Value("${ssh.tunnel.username}")
    private String username;

    @Value("${ssh.tunnel.password}")
    private String password;

    @Value("${ssh.tunnel.port:22}")
    private int port;

    private Session session;

    @PostConstruct
    public void init() throws Exception {
       JSch jsch = new JSch();
       // Get SSH session
       session = jsch.getSession(servUser, host, port);
       session.setPassword(servPwd);
       java.util.Properties config = new java.util.Properties();
       // Never automatically add new host keys to the host file
       config.put("StrictHostKeyChecking", "no");
       session.setConfig(config);
       // Connect to remote server
       session.connect();
       // Apply the port forwarding
       session.setPortForwardingL(lport, rhost, rport);
    }

    @PreDestroy
    public void shutdown() throws Exception {
       if (session != null && session.isConnected()) {
           session.disconnect();
       }
    }
}

这样您就可以使用Spring来配置和管理隧道。如果您愿意,您甚至可以将其作为特定环境的条件。在进行本地开发时没有隧道,并将其用于测试和生产环境。