2016-12-02 9 views
-1

以下のコードは '1'を出力し、 '2'を出力しません。結果として、indexメソッドで処理されるページを要求するとブラウザがハングします。将来は決して呼び出されません。 future.mapステートメントがAwait.result(future, Duration.Inf)に置き換えられた場合、コードは正常に動作します。何が問題ですか?Slickトランザクションの未来がScalaのPlayで呼び出されない

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

まず、httpリクエストごとにdb接続を作成しないでください。 finally節が実行される前に、おそらくfinally節が実行され、これが問題の原因となる可能性があります。

それ以外はうまく見えます。アプリケーションの起動時またはDI経由でリソースを初期化し、アプリケーション停止時にdbを閉じて、問題がまだ発生していないかどうかを確認してください。

+0

問題はfuture.mapが実行される前に接続が閉じられていたことでした。 – ps0604

関連する問題