无法连接 Spring Boot -Google App Engine 与 Postgresql - Cloud Sql
Cannot connect Spring Boot -Google App Engine with Postgresql - Cloud Sql
所以我一直在尝试将我的 Spring 引导应用程序(在 Google App Engine 中)与云 SQL (Postgresql) 连接,并且收到以下错误:
A 2020-03-15T04:58:41.951800182Z org.postgresql.util.PSQLException: The connection attempt failed.
A 2020-03-15T04:58:41.951800183Z at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:272) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800184Z at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800185Z at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:215) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800186Z at org.postgresql.Driver.makeConnection(Driver.java:404) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800187Z at org.postgresql.Driver.connect(Driver.java:272) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800188Z at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:310) ~[tomcat-jdbc-8.5.23.jar!/:na]
A 2020-03-15T04:58:41.951800189Z at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203) ~[tomcat-jdbc-8.5.23.jar!/:na]
A 2020-03-15T04:58:41.951800190Z at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:735) [tomcat-jdbc-8.5.23.jar!/:na]
A 2020-03-15T04:58:41.951800191Z at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:667) [tomcat-jdbc-8.5.23.jar!/:na]
A 2020-03-15T04:58:41.951800192Z at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:482) [tomcat-jdbc-8.5.23.jar!/:na]
A 2020-03-15T04:58:41.951800193Z at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154) [tomcat-jdbc-8.5.23.jar!/:na]
...
A 2020-03-15T04:58:41.951800269Z Caused by: java.net.SocketException: already connected
A 2020-03-15T04:58:41.951800270Z at java.net.Socket.connect(Socket.java:569) ~[na:1.8.0_222]
A 2020-03-15T04:58:41.951800271Z at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:666) ~[na:1.8.0_222]
A 2020-03-15T04:58:41.951800272Z at org.postgresql.core.PGStream.<init>(PGStream.java:61) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800273Z at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800274Z ... 85 common frames omitted
我不明白"java.net.SocketException: already connected"
是什么意思
这是我在 application.properties 中的配置文件:
spring.datasource.url=${URL}
spring.datasource.username=${USER}
spring.datasource.password=${PASSWORD}
spring.datasource.driverClassName=org.postgresql.
spring.cloud.gcp.sql.enabled=true
spring.cloud.gcp.projectId={projectId}
spring.cloud.gcp.sql.instanceName={projectId}:{region}:{instanceName}
spring.cloud.gcp.sql.jdbcUrl=jdbc:postgresql://google/{dbname}?cloudSqlInstance={projectId}:{region}:{dbname}&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user={user}&password={password}
spring.cloud.gcp.sql.databaseName={DBname}
spring.cloud.gcp.sql.userName={user}
spring.cloud.gcp.sql.password={password}
spring.cloud.gcp.sql.jdbcDriver=org.postgresql.Driver
spring.cloud.gcp.sql.instance-connection-name={projectId}:{region}:{instanceName}
spring.cloud.gcp.sql.database-name={DBname}
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.id.new_generator_mappings = false
spring.jpa.properties.hibernate.format_sql = true
spring.jpa.generate-ddl=true
这是我的 app.yaml 配置文件:
runtime: java
env: flex
runtime_config:
jdk: openjdk8
env_variables:
SPRING_PROFILES_ACTIVE: "gcp,postgresql"
URL: "jdbc:postgresql://google/{dbName}?cloudSqlInstance={projectId}:{region}:{instanceName}&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user={user}&password={password}"
USER: "{user}"
PASSWORD: "{password}"
beta_settings:
cloud_sql_instances: "{projectId}:{region}:{instanceName}"
handlers:
- url: /.*
script: this field is required, but ignored
manual_scaling:
instances: 1
resources:
cpu: 2
memory_gb: 2.3
disk_size_gb: 10
volumes:
- name: ramdisk1
volume_type: tmpfs
size_gb: 0.5
云端SQL 配置为public IP。
我会很感激关于我可能做错了什么的任何想法?
我认为你应该改变你的 url:
URL:"jdbc:postgresql://google/{dbName}?cloudSqlInstance={projectId}:{region}:{instanceName}&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user={user}&password={password}"
应该是:
URL:"jdbc:postgresql:///<DATABASE_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=<MYSQL_USER_NAME>&password=<MYSQL_USER_PASSWORD>"
Note: The host portion of the JDBC URL is currently unused, and has no
effect on the connection process. The SocketFactory will get your
instances IP address base on the provided cloudSqlInstance arg.
所以我一直在尝试将我的 Spring 引导应用程序(在 Google App Engine 中)与云 SQL (Postgresql) 连接,并且收到以下错误:
A 2020-03-15T04:58:41.951800182Z org.postgresql.util.PSQLException: The connection attempt failed.
A 2020-03-15T04:58:41.951800183Z at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:272) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800184Z at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800185Z at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:215) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800186Z at org.postgresql.Driver.makeConnection(Driver.java:404) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800187Z at org.postgresql.Driver.connect(Driver.java:272) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800188Z at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:310) ~[tomcat-jdbc-8.5.23.jar!/:na]
A 2020-03-15T04:58:41.951800189Z at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203) ~[tomcat-jdbc-8.5.23.jar!/:na]
A 2020-03-15T04:58:41.951800190Z at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:735) [tomcat-jdbc-8.5.23.jar!/:na]
A 2020-03-15T04:58:41.951800191Z at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:667) [tomcat-jdbc-8.5.23.jar!/:na]
A 2020-03-15T04:58:41.951800192Z at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:482) [tomcat-jdbc-8.5.23.jar!/:na]
A 2020-03-15T04:58:41.951800193Z at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154) [tomcat-jdbc-8.5.23.jar!/:na]
...
A 2020-03-15T04:58:41.951800269Z Caused by: java.net.SocketException: already connected
A 2020-03-15T04:58:41.951800270Z at java.net.Socket.connect(Socket.java:569) ~[na:1.8.0_222]
A 2020-03-15T04:58:41.951800271Z at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:666) ~[na:1.8.0_222]
A 2020-03-15T04:58:41.951800272Z at org.postgresql.core.PGStream.<init>(PGStream.java:61) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800273Z at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144) ~[postgresql-9.4.1212.jre7.jar!/:9.4.1212.jre7]
A 2020-03-15T04:58:41.951800274Z ... 85 common frames omitted
我不明白"java.net.SocketException: already connected"
是什么意思这是我在 application.properties 中的配置文件:
spring.datasource.url=${URL}
spring.datasource.username=${USER}
spring.datasource.password=${PASSWORD}
spring.datasource.driverClassName=org.postgresql.
spring.cloud.gcp.sql.enabled=true
spring.cloud.gcp.projectId={projectId}
spring.cloud.gcp.sql.instanceName={projectId}:{region}:{instanceName}
spring.cloud.gcp.sql.jdbcUrl=jdbc:postgresql://google/{dbname}?cloudSqlInstance={projectId}:{region}:{dbname}&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user={user}&password={password}
spring.cloud.gcp.sql.databaseName={DBname}
spring.cloud.gcp.sql.userName={user}
spring.cloud.gcp.sql.password={password}
spring.cloud.gcp.sql.jdbcDriver=org.postgresql.Driver
spring.cloud.gcp.sql.instance-connection-name={projectId}:{region}:{instanceName}
spring.cloud.gcp.sql.database-name={DBname}
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.id.new_generator_mappings = false
spring.jpa.properties.hibernate.format_sql = true
spring.jpa.generate-ddl=true
这是我的 app.yaml 配置文件:
runtime: java
env: flex
runtime_config:
jdk: openjdk8
env_variables:
SPRING_PROFILES_ACTIVE: "gcp,postgresql"
URL: "jdbc:postgresql://google/{dbName}?cloudSqlInstance={projectId}:{region}:{instanceName}&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user={user}&password={password}"
USER: "{user}"
PASSWORD: "{password}"
beta_settings:
cloud_sql_instances: "{projectId}:{region}:{instanceName}"
handlers:
- url: /.*
script: this field is required, but ignored
manual_scaling:
instances: 1
resources:
cpu: 2
memory_gb: 2.3
disk_size_gb: 10
volumes:
- name: ramdisk1
volume_type: tmpfs
size_gb: 0.5
云端SQL 配置为public IP。 我会很感激关于我可能做错了什么的任何想法?
我认为你应该改变你的 url:
URL:"jdbc:postgresql://google/{dbName}?cloudSqlInstance={projectId}:{region}:{instanceName}&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user={user}&password={password}"
应该是:
URL:"jdbc:postgresql:///<DATABASE_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=<MYSQL_USER_NAME>&password=<MYSQL_USER_PASSWORD>"
Note: The host portion of the JDBC URL is currently unused, and has no effect on the connection process. The SocketFactory will get your instances IP address base on the provided cloudSqlInstance arg.