Anorm(Play Scala)中流媒体支持的优势是什么?

时间:2017-06-16 11:17:54

标签: scala anorm

我一直在阅读Play文档中的Streaming results部分。我期望找到一种基于结果创建Scala Stream的方法,因此如果我创建一个返回需要解析的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

2 个答案:

答案 0 :(得分:0)

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

根据我的个人经验,返回5,000 - 10,000行(以及更多)解析器尝试同时处理的查询消耗了大量CPU时间,导致程序无限期地挂起。

Streaming避免了尝试一次解析所有内容,甚至等待所有结果通过网络将其恢复到服务器的问题。

答案 1 :(得分:0)

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