Вы можете использовать шаблон сеанса для разговора a.k.a. "длинные разговоры". Попробуйте подключаемый модуль Grails для веб-потока, который работает таким образом, или, если вы считаете, что веб-поток не подходит для ваших нужд, самостоятельно внедрите сеанс для разговора.
Основная предпосылка - в начале разговора вы открываете новый сеанс гибернации (с режимом сброса = ручной) и сохраняете его в сеансе http пользователя. В начале каждого последующего http-запроса необходимо убедиться, что sessionFactory.getCurrentSession возвращает сеанс гибернации диалога, и не забудьте отключить этот сеанс в конце каждого запроса, чтобы закрыть соединение jdbc между запросами. Когда вы достигаете конца разговора, вы сбрасываете сеанс, чтобы сохранить все изменения, или закрываете, не сбрасывая, чтобы отменить их.
Веб-сайт hibernate / Java Persistence с книгой Hibernate содержит некоторые действительно полезные сведения о том, как это сделать, но кроме веб-потока в Grails отсутствует встроенная поддержка. Я нахожусь в процессе написания плагина SessionPerConversation, но это очень рано. Мой подход состоял в том, чтобы посмотреть на исходный код Grails 1.2.0 и скопировать, как они реализовали .withNewSession, а затем украсить мои контроллеры методами .withConversation, .endConversation и .discardConversation. Когда я продвинусь немного дальше, я, вероятно, опубликую код на State Your Bizness
Готы, с которыми я сталкивался до сих пор ...
Если пользователь никогда не заканчивает свой диалог, сеанс гибернации будет оставаться открытым (хотя и не соединение jdbc), пока время его сеанса http не истечет. Если вы поддерживаете несколько разговоров, то у каждого пользователя может быть несколько сессий hiberate, а для сайта с высокой нагрузкой могут возникнуть проблемы с памятью
Вы должны следить за автоматической очисткой сеанса. Это может произойти, когда вы создаете новые объекты в зависимости от того, какую стратегию вы используете для генерации идентификатора, или если вы вызываете транзакционные услуги .