I have a SpringBoot application that I have deployed on App Engine my database is MySQL 8. For my local testing I could connect to Cloud DB using public IP and connection works fine.
But when this application is deployed on App Engine I am getting Error:
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)
I have followed the steps as mentioned in document : 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
I am not sure what am I missing out while connecting from App Engine. Please assist.
When you use the Cloud SQL feature in APp ENgine (or Cloud Functions or Cloud Run) to connect your Cloud SQL database, the service open a socket to connect the database. You don't have to use the public IP but the opened soket.
It's similar to a Cloud SQL Proxy in socket mode. You have documentation with a Java example here