无法为 CloudSQL 获取 jdbcUrl=jdbc:postgresql:///<dbname> 错误的驱动程序实例

Failed to get driver instance for jdbcUrl=jdbc:postgresql:///<dbname> error for CloudSQL

我正在尝试从我的本地计算机连接到我的 GCP 项目 PostgreSQL CloudSQL 实例。 PostgreSQL 没有 public IP,只有私有 IP。

    Properties connProps = new Properties();
    connProps.setProperty("user", "XXX-compute@developer.gserviceaccount.com");
    connProps.setProperty("password", "password");
    connProps.setProperty("sslmode", "disable");
    connProps.setProperty("socketFactory", "com.google.cloud.sql.postgres.SocketFactory");
    connProps.setProperty("cloudSqlInstance", "coral-XXX-XXXX:us-central1:mdm");
    connProps.setProperty("enableIamAuth", "true");

    HikariConfig config = new HikariConfig();
    config.setJdbcUrl(jdbcURL);
    config.setDataSourceProperties(connProps);
    config.setConnectionTimeout(10000); // 10s

    HikariDataSource connectionPool = new HikariDataSource(config);

我收到以下错误

Failed to get driver instance for jdbcUrl=jdbc:postgresql:///mdm

java.sql.SQLException: No suitable driver

我已验证我的用户名、实例名、IAM 连接都工作正常。我使用的 IAM 服务帐户是我的计算引擎的默认服务帐户。

我应该能够从我的本地机器连接到这个 PostgreSQL 实例吗?

虽然从安全角度来看,仅启用私有 IP 并从云 SQL 实例中删除 public IP 是一种很好的做法,但仍需牢记一些注意事项在考虑连通性时。

云 SQL 实例只启用了私有 IP,您无法直接从本地机器连接到它,无论是使用私有 IP 还是使用云 SQL代理。

现在,在你的情况下,正如你提到的,你在云 SQL 实例中只启用了私有 IP,这似乎是你收到错误的原因。

减轻错误-

如果可以的话,我会推荐你​​provision a public IP address 对于 Cloud SQL 实例,然后尝试正确连接它 指定 jdbc URL 如前所述 here,看起来像这样 -

jdbc:postgresql:///<DATABASE_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=<POSTGRESQL_USER_NAME>&password=<POSTGRESQL_USER_PASSWORD>

否则,如果您不想提供 public IP 地址,可以 从您可以使用的外部资源建立连接 云 VPN 隧道或 VLAN 连接(如果您有专用网络) here.

中提到的互连或合作伙伴互连

如果您没有专用互连或合作伙伴互连,并且您只想使用私有 IP 连接到云 SQL,您可以通过 Compute Engine VM 实例启用端口转发.这是分两步完成的 -

  • 通过私有 IP 将计算引擎连接到云 SQL 实例。
  • 将本地计算机数据库连接请求转发到计算引擎以通过云 SQL 代理隧道到达云 SQL 实例。 youtube video 描述了如何做到这一点。

要获得上述内容的详细说明,您可以查看 this article

首先,确保您正确配置 JDBC URL。

URL 应该是这样的:

jdbc:postgresql:///<DATABASE_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=<POSTGRESQL_USER_NAME>&password=<POSTGRESQL_USER_PASSWORD>

详情见docs

其次,如果您的 Cloud SQL 实例仅为私有 IP,则您的本地计算机将没有指向它的网络路径,除非您已明确配置一个(请参阅 this answer 了解选项).

通常,连接到私有 IP 实例的最简单方法是 运行 与实例位于同一 VPC 中的 VM,并从该 VM 连接。