【问题标题】:Slick query very slow光滑的查询非常慢
【发布时间】:2013-11-18 21:38:42
【问题描述】:

我正在尝试学习 Slick,并且已经启动并运行了一个 Postgres 数据库。我做了一个小程序来测试它:

import scala.slick.driver.PostgresDriver.simple._
import Database.threadLocalSession

object Names extends Table[(String)]("names")     
{
    def name = column[String]("name", O.PrimaryKey)
    def * = name
}

object DbTest
{
    val db = Database.forURL("jdbc:postgresql://localhost:5432/names", 
                              driver = "org.postgresql.Driver")

    def main(args : Array[String]) =
    {
        print("Doing something... ")

        db withTransaction 
        {
            Query(Names) foreach 
            { 
                case (name) =>
                    println(name)
            }
        }
        println("... done!")
    }
}

问题是在print("Doing something... ") 之后发生任何事情大约需要 5 秒。如果我复制 db withTransaction 块,两个块在前 5 秒后快速连续执行。有什么想法吗?

【问题讨论】:

  • 当你从命令行连接到 postgres 时,需要多长时间?因为我看不出有什么需要花那么长时间的。
  • 几乎是即时的!
  • 查询返回多少行?
  • 只有一个 - “John Doe”。
  • 好的,还有两个问题,您使用的是什么版本的 slick、scala 和可能的 postgresql 驱动程序?如果你在 linux 上,你可以尝试使用 url jdbc:postgresql:names 而不是 jdbc:postgresql://localhost:5432/names 连接吗?我不确定这是否也适用于 Windows。现在我回家了,我可以尝试一下,使用 scala 2.10.2 和 slick 1.0.1,你的代码对我来说只需要几分之一秒。

标签: postgresql scala slick


【解决方案1】:

不确定我是否知道具体问题,但您的代码示例中有一些内容会影响性能。

1) 确保您使用的是Query Templates。使用 Slick 构建查询有相当多的开销,您不想在每个查询上重复这些开销。

2) 您也不应该在实际代码中使用 threadLocalSession(参见线程 here)。它应该如下所示。

3) 使用C3P0 之类的连接池。

例子:

val pool = // some connection pool like C3P0 or other

Database.forDataSource(pool).withSession { implicit session: Session =>
  ...
}

【讨论】:

    猜你喜欢
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2015-11-01
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多