Играйте плавно и асинхронно — это состояние гонки?

Чтение Код Play-Slick DBAction, я подумал, что этот код может содержать состояние гонки:

object DBAction{
  // snip

  def apply(r: (RequestWithDbSession) => Result)(implicit app:Application) = {
    Action { implicit request => 
      AsyncResult {
        DB.withSession{ s:scala.slick.session.Session =>
          Future(r( RequestWithDbSession(request,s) ))(executionContext)
      }
    }
  }
}

Функция r запускается в будущем, после того как withSession вернет Future[Result] и вызовет session.close(). Есть ли в этом коде состояние гонки?


person thesamet    schedule 02.09.2013    source источник


Ответы (2)


Я не уверен, что это называется состоянием гонки. Однако мне кажется, что вы правы, что что-то здесь не так. Сеанс может перестать быть действительным, когда будущее выполнит код.

Было бы лучше инвертировать выполнение и запросить сеанс базы данных из будущего:

Async {
  Future {
    DB.withSession{ s:scala.slick.session.Session =>
      r( RequestWithDbSession(request, s) )
    }
  }
}
person EECOLOR    schedule 02.09.2013

Я думаю, что вы правы, и исправление, предложенное EECOLOR, выглядит правильным. Мы отслеживаем это в тикете: https://github.com/freekh/play-slick/issues/81

Спасибо

person cvogt    schedule 03.09.2013