在我的
Spring Boot
应用程序 WAR 中,我有一个 application.properties
文件,其中我定义了以下 datasource
属性:
spring.datasource.url=jdbc:mysql://localhost/test?autoReconnect=true&useSSL=false&rewriteBatchedStatements=true
spring.datasource.username=used
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
有了这个,我就可以连接到数据库了。
现在,我想通过
SSH tunnel
连接到另一个数据库。我应该如何指定 spring.datasource.url
才能获得这样的连接?
请注意,我不想编写任何样板 Java 代码来执行此 SSH 隧道!
附注我用谷歌搜索但找不到满意的答案。
如果您正在寻找的话,我认为 spring 无法为您创建 SSH 隧道。如果你想在代码中完成,你需要像jsch这样的框架。
最好的解决方案是在服务器上手动或使用 autossh 创建 SSH 隧道(以保持其正常运行)。 要手动创建隧道,请登录到您的应用程序服务器并在屏幕中运行以下命令:
ssh -L 3307:localhost:3306 serverIp
3306是mysql运行的端口。 3307 是您要转发的端口。 有了这个隧道,您现在可以使用以下方式进行连接:
spring.datasource.url=jdbc:mysql://localhost:3307/
和我有同样的问题。
我的解决方案已解决,
第1步:在VPC内创建ec2实例公共子网
第 2 步: 在 安全组中 此 ec2 实例必须允许端口 22 (SSH)
第 3 步: RDS MySQL 必须允许私有 IP ec2 实例 才能访问
第 4 步: 在 Dev Local ~> 设置转发侦听器 tcp_ip 打开终端
ssh -f <user>@<ec2-public-dns> -L <localhost_ip>:<localhost_port>:<rds_mysql_host_ip>:<rds_mysql_host_port> -N -i <private_key>.pem
示例:
ssh -f ec2-user@ec2-public-dns -L dev-mysql-c-lib.internal:3306:***.ap-southeast-1.rds.amazonaws.com:3306 -N -i ~/.ssh/ec2-instance.pem
第5步:在文件配置application-dev.yml中
将主机从 public-dns 更改为 internal-dns
示例:
主机:'***.ap-southeast-1.rds.amazonaws.com'
到
主机:'dev-mysql-c-lib.internal'
spring.datasource.url: jdbc:mysql://dev-mysql-c-lib.internal:3306/mydb
终于可以运行 Spring Boot 了
查找 MySQL 已连接
为我工作。 ^____^
我尝试了这个代码并成功了
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://<local_host_ip>:<local_arbitrary_port>/mydb",userName,password);
System.out.println(conn.getMetaData().getUserName());
return conn;
}catch(Exception e){
e.printStackTrace();
}
与您在问题中使用的相同,但如果您的数据库使用自签名证书,则 useSSL=true 和可能 verifyServerCertificate=false 除外。