将 JDBC 连接到 PostgreSQL 方言数据库

您可以将 PostgreSQL JDBC 驱动程序或 Spanner JDBC 驱动程序与 Spanner PostgreSQL 方言数据库搭配使用。本页介绍了如何使用这些驱动程序连接到您的数据库。

PostgreSQL JDBC 驱动程序

本部分介绍了如何将 PostgreSQL JDBC 驱动程序连接到 Spanner 中的 PostgreSQL 方言数据库。JDBC 是 PostgreSQL 的标准 Java 驱动程序。

如果您使用 PostgreSQL JDBC 驱动程序,则必须使用 PGAdapter 在 PostgreSQL 网络协议和 Spanner 网络协议之间进行转换。您可以将 PGAdapter 添加为依赖项,并在应用的进程内运行它。

  1. 将 PGAdapter 和 PostgreSQL JDBC 驱动程序作为依赖项添加到您的应用中。

    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>0.50.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-spanner-pgadapter</artifactId>
      <version>0.50.0</version>
    </dependency>
  2. 在应用的进程中启动 PGAdapter。
    OptionsMetadata.Builder builder =
      OptionsMetadata.newBuilder()
        .setProject("PROJECT_NAME")
        .setInstance("INSTANCE_NAME")
        .setPort(PORT);
    ProxyServer server = new ProxyServer(builder.build());
    server.startServer();
    server.awaitRunning();
          

    替换以下内容:

    • PORT:PGAdapter 正在运行的端口号。在大多数情况下设置为 5432,或设置为 0 以使用动态分配的端口。
  3. 确保已加载 PostgreSQL JDBC 驱动程序。
    Class.forName("org.postgresql.Driver");
    try (Connection connection = DriverManager.getConnection("jdbc:postgresql://APPLICATION_HOST:PORT/DATABASE_NAME")) { try (ResultSet resultSet = connection.createStatement().executeQuery("select 'Hello world!' as hello")) { while (resultSet.next()) { System.out.printf( "Greetings from Cloud Spanner PostgreSQL: %s\n", resultSet.getString(1)); } } }

    替换以下内容:

    • APPLICATION_HOST:运行 PGAdapter 的机器的主机名或 IP 地址。如果在本地运行,请使用 localhost

    PGAdapter GitHub 代码库包含一个示例应用

Unix 网域套接字

本部分介绍如何使用 Unix 网域套接字将 PostgreSQL JDBC 驱动程序连接到 PostgreSQL 方言数据库。使用 Unix 网域套接字可实现尽可能低的延迟时间。

如需使用 Unix 网域套接字,PGAdapter 必须与客户端应用在同一主机上运行。

// Make sure the PG JDBC driver is loaded.
Class.forName("org.postgresql.Driver");
try (Connection connection = DriverManager.getConnection("jdbc:postgresql://APPLICATION_HOST/DATABASE_NAME" + "?socketFactory=org.newsclub.net.unix.AFUNIXSocketFactory$FactoryArg" + "&socketFactoryArg=DIRECTORY_NAME.s.PGSQL.PORT")) { try (ResultSet resultSet = connection.createStatement().executeQuery("select 'Hello world!' as hello")) { while (resultSet.next()) { System.out.printf("Greeting from Cloud Spanner PostgreSQL: %s\n", resultSet.getString(1)); } } }

替换以下内容:

  • APPLICATION_HOST:运行 PGAdapter 的机器的主机名或 IP 地址。如果在本地运行,请使用 localhost
  • 命令行参数。例如 /tmp
  • PORT:PGAdapter 正在运行的端口号。如果 PGAdapter 在自定义端口上运行,请在连接字符串中更改此设置。否则,请使用默认端口 5432

Spanner JDBC 驱动程序

本部分介绍了如何使用 Spanner JDBC 驱动程序连接到 PostgreSQL 方言数据库。

  1. 将 Spanner JDBC 驱动程序作为依赖项添加到您的应用。

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.google.cloud</groupId>
          <artifactId>libraries-bom</artifactId>
          <version>26.66.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    
    <dependencies>
      <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>google-cloud-spanner-jdbc</artifactId>
        <exclusions>
          <exclusion>
            <groupId>com.google.api.grpc</groupId>
            <artifactId>proto-google-cloud-spanner-executor-v1</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
  2. 使用 Spanner JDBC 连接网址连接到 PostgreSQL 方言数据库。

        // Make sure the PostgreSQL JDBC driver is loaded.
        Class.forName("org.postgresql.Driver");
    try (Connection connection = DriverManager.getConnection( "jdbc:cloudspanner:/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME")) { try (ResultSet resultSet = connection.createStatement().executeQuery("select 'Hello world!' as hello")) { while (resultSet.next()) { System.out.printf( "Greetings from Cloud Spanner PostgreSQL: %s\n", resultSet.getString(1)); } } }

    驱动程序会自动检测指定数据库的 SQL 方言。连接网址中不需要方言参数。

后续步骤