我有一个远程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值什么?还是其他任何建议?感谢。
答案 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来配置和管理隧道。如果您愿意,您甚至可以将其作为特定环境的条件。在进行本地开发时没有隧道,并将其用于测试和生产环境。