在 App Engine 上部署了 Hibernate 的 Spring Boot 应用无法连接到云 SQL
SpringBoot App with Hibernate deployed on App Engine failed connecting to Cloud SQL
我有一个部署在 App Engine 上的 SpringBoot 应用程序,我的数据库是 MySQL8。
对于我的本地测试,我可以使用 public IP 连接到云数据库并且连接工作正常。
但是在 App Engine 上部署此应用程序时出现错误:
2021-11-09 01:44:50 default[1] 2021-11-09 01:44:50.874 INFO 10 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final
2021-11-09 01:44:51 default[1] 2021-11-09 01:44:51.092 INFO 10 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-11-09 01:46:58 default[1] 2021-11-09 01:46:58.343 WARN 10 --- [ main] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata
2021-11-09 01:46:58 default[1]
2021-11-09 01:46:58 default[1] com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
2021-11-09 01:46:58 default[1]
2021-11-09 01:46:58 default[1] The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
2021-11-09 01:46:58 default[1] at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
2021-11-09 01:46:58 default[1] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Caused by: java.net.ConnectException: Connection timed out (Connection timed out)
我已按照文档中提到的步骤进行操作:
https://cloud.google.com/sql/docs/mysql/connect-app-engine-standard
app.yaml
runtime: java11
instance_class: F2
entrypoint: java -noverify -jar strategy-0.0.1-SNAPSHOT.war
application.properties
#spring.datasource.url=jdbc:mysql://35.345.11.132:3306/fin_strat
spring.datasource.url=jdbc:mysql://localhost:3306/fin_strat
spring.datasource.username=<database-user-name>
spring.datasource.password=<database-password>
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
我不确定从 App Engine 连接时我错过了什么。
请协助。
当您使用 APP ENgine(或 Cloud Functions 或 Cloud 运行)中的 Cloud SQL 功能连接您的 Cloud SQL 数据库时,该服务会打开一个套接字来连接数据库。您不必使用 public IP,而是打开的套接字。
它类似于套接字模式下的云 SQL 代理。您有包含 Java 示例 here
的文档
我有一个部署在 App Engine 上的 SpringBoot 应用程序,我的数据库是 MySQL8。 对于我的本地测试,我可以使用 public IP 连接到云数据库并且连接工作正常。
但是在 App Engine 上部署此应用程序时出现错误:
2021-11-09 01:44:50 default[1] 2021-11-09 01:44:50.874 INFO 10 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final
2021-11-09 01:44:51 default[1] 2021-11-09 01:44:51.092 INFO 10 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-11-09 01:46:58 default[1] 2021-11-09 01:46:58.343 WARN 10 --- [ main] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata
2021-11-09 01:46:58 default[1]
2021-11-09 01:46:58 default[1] com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
2021-11-09 01:46:58 default[1]
2021-11-09 01:46:58 default[1] The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
2021-11-09 01:46:58 default[1] at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
2021-11-09 01:46:58 default[1] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Caused by: java.net.ConnectException: Connection timed out (Connection timed out)
我已按照文档中提到的步骤进行操作: https://cloud.google.com/sql/docs/mysql/connect-app-engine-standard
app.yaml
runtime: java11
instance_class: F2
entrypoint: java -noverify -jar strategy-0.0.1-SNAPSHOT.war
application.properties
#spring.datasource.url=jdbc:mysql://35.345.11.132:3306/fin_strat
spring.datasource.url=jdbc:mysql://localhost:3306/fin_strat
spring.datasource.username=<database-user-name>
spring.datasource.password=<database-password>
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
我不确定从 App Engine 连接时我错过了什么。 请协助。
当您使用 APP ENgine(或 Cloud Functions 或 Cloud 运行)中的 Cloud SQL 功能连接您的 Cloud SQL 数据库时,该服务会打开一个套接字来连接数据库。您不必使用 public IP,而是打开的套接字。
它类似于套接字模式下的云 SQL 代理。您有包含 Java 示例 here
的文档