2017-06-16 93 views
1

我一直在阅读Play文档中的Streaming results。我期望找到的是基于结果创建Scala Stream的方法,所以如果我创建一个返回需要解析的10,000行的运行,它将分批解析它们(例如,一次100个)或者只是解析第一个,并解析其余的需求(所以,Stream)。Anorm(Play Scala)支持流媒体的优势是什么?

我发现(从我的理解,我可能是完全错误的)基本上是一个一个地解析结果的方法,但最后它会创建一个包含所有解析结果的列表(如果有像这样,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 

回答

0

解析一个非常大的行数仅仅是低效的。对于一个简单的类你可能不会觉得这很容易,但是当你开始添加一些连接并且有一个更复杂的解析器时,当行数达到数千时,你会看到巨大的性能。

从我个人的经验来看,返回5,000到10,000行(以及更多)的解析器试图同时处理所有的查询会消耗太多的CPU时间,以致程序无限期挂起。

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

0

我会建议使用Anorm查询结果作为SourceAkka Streams。 我成功地以数百行的方式流式传输。