Проблема со скверилом и игрой!рамки в скале - PullRequest
4 голосов
/ 04 августа 2011

У меня возникла любопытная проблема при использовании Squeryl с Play !.

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

Вот так я настраиваю Squeryl:

def initDB() {
  import org.squeryl._
  import play.db.DB

  Class.forName("com.mysql.jdbc.Driver")
  SessionFactory.concreteFactory = Some(() =>
    Session.create( DB.getConnection, new MySQLAdapter) )
}

Пример транзакции, также упомянутой втрассировка стека ниже:

transaction {
  import models.Game
  Game.planets.insert(planetList) 
  Game.moons.insert(moonList)
}

трассировка стека:

Internal Server Error (500) for request GET /generate-galaxy

Execution exception (In /app/Generator.scala around line 330)
SQLException occured : You can't operate on a closed Connection!!!

play.exceptions.JavaExecutionException: You can't operate on a closed Connection!!!
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:228)
    at Invocation.HTTP Request(Play!)
Caused by: java.sql.SQLException: You can't operate on a closed Connection!!!
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65)
    at org.squeryl.dsl.QueryDsl$class._executeTransactionWithin(QueryDsl.scala:95)
    at org.squeryl.dsl.QueryDsl$class.transaction(QueryDsl.scala:64)
    at org.squeryl.PrimitiveTypeMode$.transaction(PrimitiveTypeMode.scala:40)
    at generator.Generator$$anonfun$generatePlanets$2.apply(Generator.scala:330)
    at generator.Generator$$anonfun$generatePlanets$2.apply(Generator.scala:55)
    at generator.Generator$.generatePlanets(Generator.scala:55)
    at generator.Generator$.generateGalaxy(Generator.scala:36)
    at controllers.MainRouter$.generateGalaxy(MainRouter.scala:29)
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:543)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:499)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:493)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:470)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:158)
    ... 1 more
Caused by: java.lang.NullPointerException
    ... 14 more

Я знаю, что проблема не в моих запросах, потому что они отлично работали при использовании скалатры в качестве веб-фреймворка.Я мог бы просто поместить все в один блок транзакции, но это не очень элегантно, и я также не уверен, что это сработает в этом случае - список planetList содержит около 3 миллионов членов, что вызвало scalaисчерпать память, прежде чем разделить вставку базы данных на более мелкие блоки по 50 тыс. элементов.

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Я хотел бы посмотреть, как соотносится первый tx, он выполняется сразу же?Они вложенные?

Когда у вас есть 2 транзакции, вы можете сделать это:

val s1 = Session.create( DB.getConnection, new MySQLAdapter) )
val s2 = Session.create( DB.getConnection, new MySQLAdapter) )


using(s1) {...   .... s1.connection.commit}
using(s2) {...   .... s1.connection.commit}
1 голос
/ 08 августа 2011

Не могли бы вы переслать свой вопрос в список рассылки Squeryl ? Я не знаком с Play! но я знаю, что некоторые другие пользователи и коммиттеры. Если бы вы могли опубликовать пример проекта на GitHub и добавить ссылку, которая также была бы полезна.

...