【发布时间】:2022-01-31 20:41:41
【问题描述】:
我正在尝试按照此处的文档使用 JDBC SocketFactory 连接到 Postgres Cloud SQL 实例:https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory/blob/main/docs/jdbc-postgres.md
HikariDataSource pool = null;
HikariConfig config = new HikariConfig();
//String jdbcURL = String.format("jdbc:postgresql:///%s", DBNAME);
String jdbcURL = String.format("jdbc:postgresql:///%s?cloudSqlInstance=%s&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=%s&password=%s&enableIamAuth=true&sslmode=disable",DBNAME,CLOUDSQLINSTANCE,USER,PASSWORD);
Properties connProps = new Properties();
connProps.setProperty("user", USER);
connProps.setProperty("password", PASSWORD);
connProps.setProperty("sslmode", SSLMODE);
connProps.setProperty("socketFactory", SOCKETFACTORY);
connProps.setProperty("cloudSqlInstance", CLOUDSQLINSTANCE);
connProps.setProperty("enableIamAuth", ENABLEIAMAUTH);
connProps.setProperty("ipTypes","PRIVATE");
System.out.println("jdbcurl: " + jdbcURL);
config.setJdbcUrl(jdbcURL);
config.setDataSourceProperties(connProps);
config.setConnectionTimeout(10000); // 10s
try {
pool = new HikariDataSource(config);
}
catch (Exception e){
System.out.println(e.getMessage() + e.getMessage() );
e.printStackTrace();
}
我得到的错误是:
com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: 失败 初始化池:致命:用户密码验证失败 “XXXXXX-compute@developer.gserviceaccount.com”在 com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:596) 在 com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:582) 在 com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) 在 com.zaxxer.hikari.HikariDataSource.(HikariDataSource.java:81) 在 com.aexp.ngbd.mdm.util.ConnectionUtil.createConnectionPool(ConnectionUtil.java:49) 在 com.aexp.ngbd.mdm.avro.AvroToSQLInsert.createSQLFile(AvroToSQLInsert.java:84) 在 com.aexp.ngbd.mdm.avro.ReadFromPubSub.lambda$subscribeWithAvroSchemaExample$0(ReadFromPubSub.java:48) 在 com.google.cloud.pubsub.v1.MessageDispatcher$4.run(MessageDispatcher.java:396) 在 java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) 在 java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) 在 java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:829) 引起: org.postgresql.util.PSQLException:致命:密码验证 用户“XXXXXXXX-compute@developer.gserviceaccount.com”失败 在 org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:623) 在 org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:163) 在 org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:215) 在 org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51) 在 org.postgresql.jdbc.PgConnection.(PgConnection.java:225) 在 org.postgresql.Driver.makeConnection(Driver.java:466) 在 org.postgresql.Driver.connect(Driver.java:265) 在 com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:121) 在 com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) 在 com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) 在 com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) 在 com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ... 12 更多
我在计算引擎上运行 jar。我可以使用 psql 使用已启用 IAM 身份验证的相同 ServiceAccount 连接到 PostgreSQL 实例。我通过下面的云 SQL 身份验证代理连接:
satish@XXXX-load:~$ psql "host=127.0.0.1 sslmode=disable dbname=mdm user=XXXXXXX-compute@developer port=1234" psql (11.14 (Debian 11.14-0+deb10u1), server 13.4) WARNING: psql major version 11, server major version 13. Some psql features might not work. Type "help" for help. mdm=> \dt
我的问题是,如何仅使用 Java 中的 ServiceAccount 连接到 Postgres 实例?
以下是我的 pom.xml 依赖项:
<dependency>
<groupId>com.google.cloud.sql</groupId>
<artifactId>postgres-socket-factory</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.3.1</version>
</dependency>
com.google.cloud.sql:postgres-socket-factory:1.4.2-dev 在 Maven 中心似乎不可用。这是问题吗?我能找到的最新版本是1.4.2
即使我使用XXXXXXX-compute@developer 用户,我仍然会收到以下错误。
无法初始化池:致命:Cloud SQL IAM 服务帐号 用户“470754621570-compute@developer”的身份验证失败失败 初始化池:致命:Cloud SQL IAM 服务帐号 用户“470754621570-compute@developer”的身份验证失败 com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: 失败 初始化池:致命:Cloud SQL IAM 服务帐号 用户“470754621570-compute@developer”的身份验证失败 com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:596) 在 com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:582) 在 com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) 在 com.zaxxer.hikari.HikariDataSource.(HikariDataSource.java:81) 在 com.aexp.ngbd.mdm.util.ConnectionUtil.createConnectionPool(ConnectionUtil.java:52) 在 com.aexp.ngbd.mdm.avro.AvroToSQLInsert.convertAvroToPostgres(AvroToSQLInsert.java:37) 在 com.aexp.ngbd.mdm.avro.AvroToSQLInsert.createSQLFile(AvroToSQLInsert.java:163) 在 com.aexp.ngbd.mdm.avro.ReadFromPubSub.lambda$subscribeWithAvroSchemaExample$0(ReadFromPubSub.java:51) 在 com.google.cloud.pubsub.v1.MessageDispatcher$4.run(MessageDispatcher.java:396) 在 java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) 在 java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) 在 java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834) 引起: org.postgresql.util.PSQLException:致命:Cloud SQL IAM 服务 用户的帐户身份验证失败 “470754621570-compute@developer”在 org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:623) 在 org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:163) 在 org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:215) 在 org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51) 在 org.postgresql.jdbc.PgConnection.(PgConnection.java:225) 在 org.postgresql.Driver.makeConnection(Driver.java:466) 在 org.postgresql.Driver.connect(Driver.java:265) 在 com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:121) 在 com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) 在 com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) 在 com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) 在 com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ... 13 更多
【问题讨论】:
-
请考虑查看this GCP documentation,尤其是标记为Troubleshoot a login failure 的部分,并查看Postgres logs,它们可能会显示有关可能有帮助的错误的详细信息。我希望它有所帮助。
标签: java postgresql google-cloud-sql hikaricp cloud-sql-proxy