2011-08-04 4 views
4

플레이와 함께 Squeryl을 사용할 때 나는 호기심이 문제가 있습니다!.Squeryl 및 Play 문제! 스칼라에서 프레임 워크

정상적인 사용 및 그 밖의 모든 기능은 정상적으로 작동합니다. 그러나 동일한 요청에서 둘 이상의 트랜잭션을 사용하면 오류가 발생합니다.

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 

내가 아는

그건 내가 Squeryl을 설정하는 방법 스칼라 트라를 웹 프레임 워크로 사용할 때 잘 작동했기 때문에 문제가 내 쿼리에 없다는 것을 알았습니다. I 일 수 있습니다. 모든 트랜잭션을 하나의 트랜잭션 블록에 넣을 수는 있지만, 실제로는 우아하지 않습니다.이 경우 작동하는지 확실하지 않습니다. 목록에는 약 300 만 명의 구성원이있어 이전에 메모리가 부족한 상태가되었습니다. 데이터베이스 삽입을 50k 요소의 더 작은 블록으로 분할했습니다.

+0

혹시 답을 받으셨어요? 나는 같은 문제를 겪고있다. – Ladlestein

+0

IIRC, 나는 단지 한 번만 거래를 사용했습니다. – Mononofu

+0

내 문제는 약간 다르지만 더 간단하지만이 동일한 문제가 많이 발생합니다. RenderArgs를 통해 Squeryl 값을 전달하면 SQL 쿼리 전체를 저장하고 다시 실행하려고합니다 ... 값을 전달하는 대신. 더 간단한 해결 방법을 찾으면 알려주세요. – crockpotveggies

답변

1

질문을 Squeryl mailing list에 다시 게시 하시겠습니까? 나는 Play에 익숙하지 않다! 하지만 다른 사용자와 커미터 중 일부는 알고 있습니다. GitHub에 예제 프로젝트를 게시하고 도움이 될만한 링크를 포함 할 수 있다면.

1

첫 번째 TX가 어떻게 관련되어 있는지보고 싶습니다. 이전에 즉시 실행 되나요? 중첩되어 있습니까? 당신이이 거래를 할 때

, 당신이 할 수 있습니다 :

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} 
+0

트랜잭션이 순차적으로 처리됩니다. 일부 처리가 완료된 후 DB에 커밋되고 더 많은 처리가 수행되고 DB에 쓰여집니다. 요청 당 단 하나의 세션 만 사용해야한다고 생각했습니다. – Mononofu

관련 문제