使用 jdbc 连接到 Google Cloud Spanner 模拟器时,需要不需要的凭据

use*_*678 3 google-cloud-platform google-cloud-spanner

当我尝试使用 Google Cloud Spanner 开源 JDBC 驱动程序进行连接时,收到以下错误消息:

应用程序默认凭据不可用。如果在 Google Compute Engine 中运行,则它们可用。否则,必须定义环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向定义凭据的文件。有关更多信息,请参阅https://developers.google.com/accounts/docs/application-default-credentials

URI:jdbc:cloudspanner:localhost:9010 /项目/我的项目/实例/我的实例/数据库/我的数据库

我认为模拟器不需要任何凭据即可在本地工作。有办法解决这个错误吗?谢谢。

Knu*_*ite 5

您是正确的,模拟器不需要任何凭据。您收到此错误的原因是 JDBC 驱动程序不知道您正在尝试连接到模拟器。相反,它认为您正在尝试连接到 localhost:9010 处的某个服务器,该服务器可能是官方模拟器或任何其他模拟器或模拟服务器。

连接模拟器有两种方式:

  1. 将环境变量设置SPANNER_EMULATOR_HOST为模拟器的地址。在这种情况下,那就是localhost:9010。设置此环境变量后,JDBC 驱动程序知道您正在尝试连接到模拟器,并将确保不需要或使用任何凭据。localhost:9010设置环境变量时,可以省略 JDBC 连接 URL 中的这一部分SPANNER_EMULATOR_HOST
  2. 在 JDBC 连接 URL 中使用特定主机名。这是您在示例中尝试使用的方法。为了指示 JDBC 驱动程序不要使用任何凭据,您需要将其包含usePlainText=true在连接 URL 中。这将告诉 JDBC 驱动程序创建纯文本连接(即无 SSL)并且不要使用任何凭据。

以下是如何通过在 URL 中指定主机名连接到模拟器的有效示例:

try (Connection connection = DriverManager.getConnection(
      "jdbc:cloudspanner://localhost:9010/projects/test-project/instances/test-instance/databases/test-db;usePlainText=true")) {
  try (ResultSet rs = connection.createStatement().executeQuery("SELECT 1")) {
    while (rs.next()) {
      System.out.printf("%d%n", rs.getLong(1));
     }
  }
}

Run Code Online (Sandbox Code Playgroud)