我正在尝试使用Slick异步查询MySQL数据库。下面的代码模板,我用来查询大约90k行的for comprehension,似乎最初工作,但程序消耗几千兆字节的RAM,并在大约200次查询后失败而没有警告。
import scala.slick.jdbc.{StaticQuery => Q}
def doQuery(): Future[List[String]] = future {
val q = "select name from person"
db withSession {
Q.query[String](q).list
}
}
我尝试使用fromURL
方法和c3p0连接池设置连接。我的问题是:这是对数据库进行异步调用的方法吗?
答案 0 :(得分:4)
异步仍然是open issue for Slick。
您可以尝试使用Iterables和流数据,而不是使用类似于此的解决方案将其存储在内存中:Treating an SQL ResultSet like a Scala Stream
虽然请在最后省略.toStream调用。它会将数据缓存在内存中,而Iterable则不会。
如果你想要一个异步版本的iterable,你可以查看Observables。
答案 1 :(得分:2)
事实证明这是一个非问题(实际上是我的代码中的一个错误,它为每个查询打开了一个新的数据库连接)。根据我的经验,您可以如上所示在Futures中打包数据库查询,稍后使用Scala Async或Rx撰写,如图所示here。良好性能所需的一切都是一个大型线程池(在我的情况下是x2)和一个同样大的连接池。
答案 2 :(得分:1)
Slick 3 (Reactive Slick)看起来可能会解决这个问题。