Slick查询非常缓慢。

5

我正在学习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秒钟后快速连续执行。有什么想法吗?

当您从命令行连接到PostgreSQL时,需要多长时间?因为我看不出哪里会花费那么长时间。 - Martin Kolinek
这是几乎瞬间完成的! - Panzerschlacht
查询返回了多少行? - Martin Kolinek
只有一个 - "John Doe"。 - Panzerschlacht
好的,还有两个问题,你使用的slick、scala和可能的postgresql驱动程序版本是什么?如果你正在使用linux,你能否尝试使用url jdbc:postgresql:names连接,而不是jdbc:postgresql://localhost:5432/names?我不确定在Windows上是否也适用。现在我已经回家了,我可以试试,并且你的代码只需要一小部分时间,我的scala 2.10.2和slick 1.0.1也是如此。 - Martin Kolinek
显示剩余2条评论
1个回答

2

我不确定您所遇到的具体问题,但您的代码示例中有一些会影响性能的问题。

1) 确保您正在使用查询模板。使用Slick构建查询时会产生相当多的开销,您不希望在每个查询中都重复这些操作。

2) 实际代码中也不应该使用threadLocalSession(请参见此处)。应该像以下示例一样:

3) 使用连接池,例如C3P0

示例:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接