Anorm (Play Scala) 中的流式支持有什么优势?

What's the advantage of the streaming support in Anorm (Play Scala)?

我一直在阅读 Play 文档中的 Streaming results 部分。我期望找到的是一种基于结果创建 Scala Stream 的方法,因此如果我创建一个 运行 需要解析的 returns 10,000 行,它将解析它们分批处理(例如一次 100 个),或者只解析第一个并在需要时解析其余的(因此,Stream)。

我发现的(根据我的理解,我可能完全错了)基本上是一种逐个解析结果的方法,但最后它创建了一个包含所有解析结果的列表(如果有任意限制你喜欢,在这种情况下 100 本书)。让我们从文档中拿这个例子:

val books: Either[List[Throwable], List[String]] = 
  SQL("Select name from Books").foldWhile(List[String]()) { (list, row) => 
    if (list.size == 100) (list -> false) // stop with `list`
    else (list := row[String]("name")) -> true // continue with one more name
  }

与以下基本实现相比,它提供了哪些优势:

val books: List[String] = SQL("Select name from Books").as(str("name"))  // please ignore possible syntax errors, hopefully understandable still

解析大量行效率很低。对于简单的 class,您可能不会轻易看到它,但是当您开始添加一些连接并拥有更复杂的解析器时,当行数达到数千时,您将开始看到巨大的性能下降。

根据我的个人经验,解析器尝试一次性处理 return 5,000 - 10,000 行(以及更多)的查询会消耗如此多的 CPU 时间,以至于程序实际上会无限期地挂起。

流式处理避免了尝试一次解析所有内容,甚至等待所有结果通过网络返回服务器的问题。

我建议使用 Anorm 查询结果作为 Source with Akka Streams。 我成功地以这种方式流式传输了数十万行。