【问题标题】:Cloud Spanner ResultSet Get LengthCloud Spanner ResultSet 获取长度
【发布时间】:2020-07-08 01:48:38
【问题描述】:

我有以下代码:

static void query(DatabaseClient dbClient) {
  try (ResultSet resultSet =
      dbClient
          .singleUse() // Execute a single read or query against Cloud Spanner.
          .executeQuery(Statement.of("SELECT SingerId, AlbumId, AlbumTitle FROM Albums"))) {
    if (resultSet is of size 1) { do something }
    while (resultSet.next()) {
      System.out.printf(
          "%d %d %s\n", resultSet.getLong(0), resultSet.getLong(1), resultSet.getString(2));
    }
  }
}

问题: 我想使用看看 resultSet 的长度是否严格为 1。

尝试解决方案: resultSet.getStats().getRowCountExact() == 1

但是:

ResultSetStats getStats() returns the ResultSetStats for the query only if the query was executed in either the PLAN or the PROFILE mode via the ReadContext.analyzeQuery(Statement, com.google.cloud.spanner.ReadContext.QueryAnalyzeMode) method or for DML statements in ReadContext#executeQuery(Statement, QueryOption...).

我不确定如何在 PLAN 或 PROFILE 模式下执行查询,我的 Java 项目中是否有某种文件允许我声明它,或者 Cloud Spanner 上的设置?

如果有人有任何想法,我也愿意为我的问题提供其他解决方案,但不确定这 4 种方法还能做什么(查看上面的链接)。

【问题讨论】:

    标签: java google-cloud-spanner


    【解决方案1】:

    很遗憾,通过查看ResultSet 的统计数据无法实现您想要做的事情。

    您可以通过调用DatabaseClient#analyzeQuery(Statement, QueryAnalyzeMode) 方法以PROFILEPLAN 模式执行查询。根据您的示例,这看起来像这样:

    static void query(DatabaseClient dbClient) {
      try (ResultSet resultSet =
          dbClient
              .singleUse() // Execute a single read or query against Cloud Spanner.
              .analyzeQuery(Statement.of("SELECT SingerId, AlbumId, AlbumTitle FROM Albums", QueryAnalyzeMode.PROFILE))) {
        while (resultSet.next()) {
          System.out.printf(
              "%d %d %s\n", resultSet.getLong(0), resultSet.getLong(1), resultSet.getString(2));
        }
      }
    }
    

    但是:结果集的统计信息只有在您消耗了整个结果集后才可用(即,一旦 ResultSet#next() 方法返回 false)。因此,您不能在使用它之前检查“结果集中的记录数是多少”。

    实现您想要做的事情的最佳方式是先执行SELECT COUNT(*) FROM ... 查询,然后根据该查询确定是否也执行第二个查询。

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 1970-01-01
      • 2021-12-10
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 2019-07-07
      相关资源
      最近更新 更多