我正在尝试使用 google dataflow 创建 ETL 管道,将数据写入 CloudSQL postgres 数据库。但我在连接到云 sql 实例时遇到错误。
String jdbcConURL = "jdbc:postgresql://google/<db-name>?cloudSqlInstance=<project-id>:<region>:<instance-name>&socketFactory=com.google.cloud.sql.postgres.SocketFactory";
pipeline
.apply(
BigQueryIO.read()
.fromQuery("select * from <big-query-table>")
.usingStandardSql()
.withoutValidation()
)
.apply(JdbcIO.<TableRow>write()
.withDataSourceConfiguration(
JdbcIO.DataSourceConfiguration
.create("org.postgresql.Driver", jdbcConURL)
.withUsername("<username>")
.withPassword("<password>")
)
.withStatement("insert into <sql-table-name> values(?,?,?)")
我收到以下未知主机错误。
java.sql.SQLException:无法创建 PoolableConnectionFactory(连接尝试失败。
java.net.UnknownHostException:谷歌在 java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:220) 在 java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) 在 java.base /java.net.Socket.connect(Socket.java:609) 在 org.postgresql.core.PGStream.(PGStream.java:61) 在 org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:121) ... 45 更多
问题似乎出在
pom.xml
中的依赖版本上。更改为最新版本的 org.postgresql
解决了这个问题。
旧版本
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1200-jdbc41</version>
</dependency>
新版本
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.6.0</version>
</dependency>