2012-12-29 1 views
10

뭔가 빠져 나오지 않습니다. 무슨 일이 일어나고 있는지의 간단한 예 :Grails, GPars 및 데이터 지속성

def testDemo() { 
    def person = new Person(...) 
    person.save(flush: true) 

    println "Number of people after save: " + Person.all.size() 

    def dummyList = [1, 2, 3, 4, 5] 

    GParsPool.withPool { num -> 
     println "Number of people after withPool: " + Person.all.size() 
     dummyList.eachParallel { 
      println "Number of people after eachParallel " + Person.all.size() 
      Person.withTransaction { 
      ... 

이 출력 : I 데이터가 지속되거나이 버그가 있으면 만들 수 세션 및 트랜잭션 뭔가를해야 할 경우

Number of people after save: 1 
Number of people after withPool: 1 
Number of people after eachParallel: 0 

는 이해가 안 돼요 GPars에 있습니다. 기본 절전 모드에서 여기서 무슨 일이 벌어지고 있습니까?

최근 작성한 Person을 병렬 종료 내에서 볼 수있게하고 싶습니다.

+0

어떻게이 문제를 극복 했습니까? @Alison – Ramisetti

답변

12

Gpars는 멀티 스레드 도구이며 도메인 클래스에 삽입 된 최대 절전 모드 세션은 스레드로부터 안전하지 않습니다.

이러한 방법을 사용하거나 직접 SessionFactory를 호출보십시오 :

  • withNewSession
  • withNewTransaction

각 스레드에 대한 세션을 여는 것은 매우 비용이 많이 드는 될 수 있음을주의하고 새로운 연결하여 데이터베이스를 홍수 수 .

+2

+1 "세션 ... 스레드로부터 안전하지 않습니다."고마워요! 이것은 동시성으로 인해 안전해야하는 장소에서 잠금 장치가 필요한 이유입니다. withTransaction 대신 withNewSession을 사용하고 있습니다. – Alison

1

나는 최근에 비슷한 문제가 있습니다. 내가 이해할 수 있듯이 스레드가 최대 절전 모드 세션을 바인드 할 수 없기 때문에 작동하지 못하는 것 같습니다. 실제로 필요하지 않은 경우 GPars에서 지속성을 처리하는 코드를 작성하십시오. 그것이 내가 일하게하는 방법입니다.