10

我正在尝试使用 Slick 异步查询 MySQL 数据库。下面的代码模板,我用它在理解中查询大约 90k 行,最初似乎可以工作,但是程序消耗了几 GB 的 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 连接池来设置连接。我的问题是:这是对数据库进行异步调用的方式吗?

4

3 回答 3

4

对于 Slick来说,异步仍然是一个悬而未决的问题。

您可以尝试使用 Iterables 和流数据,而不是将其存储在内存中,其解决方案类似于:Treating an SQL ResultSet like a Scala Stream

虽然请在最后省略 .toStream 调用。它会将数据缓存在内存中,而 Iterable 不会。

如果你想要一个异步版本的 iterable 你可以查看Observables

于 2013-11-10T20:25:10.277 回答
2

事实证明,这不是问题(实际上是我的代码中的一个错误,它为每个查询打开了一个新的数据库连接)。根据我的经验,您可以将 DB 查询包装在 Futures 中,如上所示,稍后使用Scala AsyncRx组合它们,如此所示。获得良好性能所需要的只是一个大线程池(在我的例子中是 CPU 的 x2)和一个同样大的连接池。

于 2013-11-11T13:03:18.007 回答
1

Slick 3 (Reactive Slick)看起来可以解决这个问题。

于 2015-07-03T14:45:21.950 回答