Squiryl和Play有问题!scala中的框架
我在游戏中使用Squeryl时遇到了一个奇怪的问题 正常使用和其他一切工作完全正常。但是,如果在同一个请求中使用多个事务,则会出现错误 这就是我设置Squiryl的方式:Squiryl和Play有问题!scala中的框架,scala,playframework,squeryl,Scala,Playframework,Squeryl,我在游戏中使用Squeryl时遇到了一个奇怪的问题 正常使用和其他一切工作完全正常。但是,如果在同一个请求中使用多个事务,则会出现错误 这就是我设置Squiryl的方式: def initDB() { import org.squeryl._ import play.db.DB Class.forName("com.mysql.jdbc.Driver") SessionFactory.concreteFactory = Some(() => Session.cre
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
我知道问题不在我的查询中,因为当使用scalatra作为web框架时,它们工作得很好。我可以把所有的东西都放在一个事务块中,但这不是很优雅,我也不确定它在这种情况下是否会起作用-
planetList
列表有大约300万成员,这导致scala在我将数据库插入拆分为50k个元素的较小块之前内存不足。请将您的问题重新发布到?我不熟悉游戏!但我知道其他一些用户和提交者是。如果您可以将一个示例项目发布到GitHub,并包含一个链接,这也会很有帮助。我想看看第一个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}
事务是串行执行的:完成一些处理,然后将其提交到数据库,再进行一些处理,写入数据库,等等。我以为我应该每个请求只使用一个会话。你得到过答案吗?我也遇到了同样的问题。IIRC,我只是求助于只使用一个事务。我经历了很多同样的问题,尽管我的问题有点不同和简单。当我通过RenderArgs传递一个Squeryl值时,它似乎保存了整个该死的SQL查询,并尝试再次运行它……而不是仅仅传递值。如果您找到更简单的解决方案,请告诉我。