Как использовать Squeryl externalTransactionManagementAdapter с игрой 2.0? - PullRequest
4 голосов
/ 19 марта 2012

Кто-нибудь преуспел в использовании Squeryl externalTransactionManagementAdapter с игровой платформой 2.0?:

    object Global extends GlobalSettings {
      override def onStart(app: Application) {

        SessionFactory.externalTransactionManagementAdapter = Some(() => 
            Some(new Session(
                DB.getDataSource().getConnection(), 
                dbAdapter)
            )
        )
    }

Я не могу заставить Скверила вернуть соединения в пул. Это действительно работает с SessionFactory.concreteFactory, но тогда я должен использовать блоки транзакций вместо squeryl, участвующего в управлении транзакциями Play.

Этот вопрос является более конкретным вариантом моего предыдущего вопроса: Как интегрировать Scala Squeryl ORB с фреймворком play 2.0? .

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Это мучило меня в течение последних двух дней, поэтому я взял немного кофе и потратил впустую час своей жизни, но я хотел бы показать вам, как это работает:

В вашем Global.scalaпоместите это:

 override def onStart(app: Application) {
    SessionFactory.externalTransactionManagementAdapter = Some(() => {
    if(org.squeryl.Session.hasCurrentSession) {
      org.squeryl.Session.currentSessionOption.get
    }
    else {
      val s = new org.squeryl.Session(DB.getDataSource().getConnection(), new PostgreSqlAdapter){
        override def cleanup = {
          super.cleanup
          unbindFromCurrentThread
        }
      }
      s.bindToCurrentThread
      s
    }
    })
  }

И тогда вам нужно будет выполнить некоторую очистку, чтобы ваше приложение не вышло из строя (в том же глобальном):

  /**
   * cleans up Squeryl thread to each request
   */
  override def onRouteRequest(request: RequestHeader): Option[Handler] = {
    org.squeryl.Session.currentSessionOption.foreach(_.unbindFromCurrentThread)
    super.onRouteRequest(request)
  }

Я обновлюэто, если я найду какие-либо предостережения и т.д.

0 голосов
/ 03 апреля 2012

Я сейчас "обманываю", использую SessionFactory.concreteFactory и:

trait SquerylTransaction {
  def TransAction(f: Request[AnyContent] => Result): Action[AnyContent] = {
    Action { request =>
      transaction {
        f(request)
      }
    }
  }
}

и в контроллере:

object Application extends Controller with SquerylTransaction {

  def doStuff() = TransAction { 
    //squeryl query      
  }
}

, но решение Делонга может быть лучше.

Мой Global.scala выглядит так:

object Global extends GlobalSettings {

  val dbAdapter = new PostgreSqlAdapter()

  override def onStart(app: Application): Unit = {
    SessionFactory.concreteFactory = Some(() =>
      Session.create(
        DB.getDataSource().getConnection(),
        dbAdapter))
  }

}
...