2013-11-18 4 views
4

Я пытаюсь изучить Slick и получить базу данных Postgres. Я сделал маленькую программу, чтобы проверить это следующим образом:Slick query очень медленно

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!") 
    } 
} 

Проблема заключается в том, что она занимает около 5 секунд, пока что-нибудь произойдет после print("Doing something... "). Если я дублирую блок db withTransaction, оба блока выполняются быстро после этих первых 5 секунд. Есть идеи?

+0

При подключении к Postgres из командной строки, сколько времени это займет? Потому что я не вижу ничего, что должно занять много времени. –

+0

Это практически мгновенно! – Panzerschlacht

+0

Сколько строк возвращается из запроса? –

ответ

2

Не уверен, что я знаю конкретную проблему, но в вашем примере кода есть несколько вещей, которые будут представлять интерес для производительности.

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 => 
    ... 
} 
Смежные вопросы