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 {
            ...

Это выводит:

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

Я не понимаю, нужно ли мне что-то делать с сеансом и транзакцией, чтобы данные сохранялись, или это ошибка в GPars. Что здесь происходит на базовом уровне гибернации?

Я хочу, чтобы недавно созданный человек был виден в параллельном закрытии.


person Alison    schedule 29.12.2012    source источник
comment
как ты это преодолел? @Элисон   -  person Rax    schedule 09.12.2017


Ответы (2)


Gpars — это многопоточный инструмент, и сеанс гибернации, внедренный в класс вашего домена, не является потокобезопасным.

Попробуйте использовать эти методы или вызвать SessionFactory напрямую:

  • withNewSession
  • с новой транзакцией

Помните, что открытие сеанса для каждого потока может быть чрезвычайно дорогостоящим и может привести к переполнению вашей базы данных новыми соединениями.

person Raphael    schedule 31.12.2012
comment
+1 сеанс ... не является потокобезопасным. Спасибо! Это объясняет, почему мне понадобилась блокировка в месте, которое должно было быть защищено от параллелизма. Я использую withNewSession вместо withTransaction. - person Alison; 31.12.2012

Недавно у меня возникла похожая проблема. Как я понял, похоже, что потоки не смогли связать сеанс гибернации, я тоже не могу заставить его работать. Если вам это на самом деле не нужно, попробуйте написать код, связанный с персистентностью, вне GPars. Вот так я заставляю это работать.

person Ither    schedule 30.12.2012