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. Что происходит здесь на базовом спящем уровне?

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

Ответ 1

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

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

  • withNewSession
  • withNewTransaction

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

Ответ 2

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