2016-12-02 11 views
-1

Код ниже печатает '1' и никогда не печатает '2', в результате браузер зависает, когда он запрашивает страницу, обслуживаемую методом index. Будущее никогда не вызывается. Если оператор future.map заменен на Await.result(future, Duration.Inf), код работает правильно. В чем проблема?Slick Transactionally future не вызывается в Play for Scala

case class UserRole (sk: Int, name: String) 

class UserRoleDB(tag: Tag) extends Table[UserRole](tag, "user_roles") { 
    def sk = column[Int]("sk", O.PrimaryKey) 
    def name = column[String]("name") 
    def * = (sk, name) <> ((UserRole.apply _).tupled, UserRole.unapply) 
} 

class Test extends Controller { 

    def index = Action.async { request => 

    val db = Database.forConfig("db1") 
    val userRoles = TableQuery[UserRoleDB] 
    val ur = UserRole(1002,"aaa") 

    try { 

      val action = (for { 
        userRole2 <- userRoles += ur 
       } yield (userRole2)).transactionally 

      val future = db.run(action) 
      println(1) 
//  val result = Await.result(future, Duration.Inf) 
      future.map { result => { 
      println(2) 
      Ok("Finished OK") 
      } 
      } 
     } 
     finally db.close 

    } 
} 

ответ

0

Прежде всего, вы не должны создавать соединение db для каждого HTTP-запроса. Во-вторых, ваше окончательное предложение выполняется, вероятно, до того, как ваше будущее будет выполнено, и это может быть причиной вашей проблемы.

Кроме этого, он выглядит хорошо. Попробуйте инициализировать ресурс при запуске приложения или через DI, закрыть db при остановке приложения, а затем посмотреть, не исчезла ли проблема.

+0

Проблема заключалась в том, что соединение было закрыто до того, как был запущен будущий.map. – ps0604