java.lang.IllegalStateException : Pool has been closed

标签 java google-cloud-spanner

通过 REST API 对 google spanner 进行读写操作时出现以下异常

已手动创建 Spanner 实例、数据库和表,并尝试读取和写入 Spanner 表,但出现此错误。想知道这个错误是由于配置还是运行时代码引起的。

帮我解决这个问题

java.lang.IllegalStateException:池已关闭 在 com.google.cloud.spanner.SessionPool.getReadSession(SessionPool.java:834) ~[google-cloud-spanner-1.11.0.jar:1.11.0] 在 com.google.cloud.spanner.DatabaseClientImpl.singleUse(DatabaseClientImpl.java:72) ~[google-cloud-spanner-1.11.0.jar:1.11.0]

最佳答案

此错误源自 Spanner 客户端库,而不是 REST API。这表明您已关闭用于获取 DatabaseClientSpanner 实例,但您仍在使用 DatabaseClient。因此以下示例将强制触发此错误:

    Spanner spanner = SpannerOptions.newBuilder()
        .setProjectId("project-id")
        .build()
        .getService();
    DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of("project-id", "instance-id", "database-id"));

    // Don't to this if you intend to use the DatabaseClient you just got on
    // the previous line at a later moment.
    spanner.close();

    // The following line will trigger the error mentioned.
    try(ResultSet rs = client.singleUse().executeQuery(Statement.of("SELECT * FROM FOO"))) {
      while(rs.next()) {
        System.out.println(rs.getCurrentRowAsStruct().toString());
      }
    }

Spanner 实例通常应在应用程序的整个生命周期中存在。仅当您确定不再与数据库进行任何进一步交互时才应该关闭它。

关于java.lang.IllegalStateException : Pool has been closed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60855094/

相关文章:

google-cloud-platform - 如何使用Google Spanner进行多个并行读取器的数据导出?

google-cloud-platform - 在 Cloud Spanner 中存储 UUID

java - RESOURCE_EXHAUSTED 池中没有可用的 session

sql - 如何通过连接具有一对多关系的 3 个表来查询唯一或不同的值

java - 为大量 JTextField 提供复制/粘贴菜单

java - 如何将远程CVS格式复制到本地文件eclipse?

使用 Scanner 和 .nextInt() 时出现 java.util.InputMismatchException

java - bukkit - 防止玩家在战斗中运行命令

java - 如何将数组转换为 ListIterator?

python - 如何查询spanner并获取元数据,特别是列的名称?