Обработка сеанса Grails в ожидающем потоке с Hibernate и MySQL InnoDB - PullRequest
0 голосов
/ 22 июля 2011

Чтобы реализовать клиентские уведомления в приложении на основе AJAX, которое я разрабатываю с Grails (и GWT), я реализовал сервисный метод, который будет блокировать до тех пор, пока он не будет сигнализирован.Я использую объект монитора для ожидания сигнала.Получив сигнал, поток будет запрашивать базу данных о новых объектах и ​​затем возвращать эти объекты в браузер.

Он отлично работает с базой данных памяти, но не так, как я ожидаю, когда использую коннектор базы данных MySQL.Что происходит: всякий раз, когда я выполняю вызов findAllBy ..., он находит только объекты, созданные до начала запроса.

Жизненный цикл моего метода обслуживания

  • запрос от клиента
  • Hibernate-сеанс создается Grails
  • сервисом, запрашивающим базу данных для новых объектов
  • , если их нет: wait
  • входящий сигнал: запрашивать базу данных для новых объектов( НЕ ПОЛУЧАЕТ НОВЫХ ОБЪЕКТОВ при использовании MySQL, отлично работает с памятью db)

Журнал запросов mysql показывает все запросы, как и ожидалось, но результат findAllBy ... isпросто пустой массив.

Я отключил запрос и кэш второго уровня.Поведение одинаково, независимо от того, подключено ли соединение для передачи данных или нет.

Что я делаю не так?Должен ли я закрыть сеанс Hibernate?Промойте это?Использовать транзакцию для моих запросов?Или как-то применить метод findAllBy ... для запроса базы данных?

Ответы [ 2 ]

0 голосов
/ 22 июля 2011

Я думаю, что вам нужно очистить сеанс при вызовах сохранения для новых объектов, которые вы ищете, например,

DomainOfFrequentlyAddedStuff.save(flush:true) 

Затем они должны быть быстро сохранены в БД, чтобы они отображалисьв вашем запросе findAll ().

0 голосов
/ 22 июля 2011

Просто предположение, но это звучит как проблема уровня изоляции транзакций, когда вы испытываете фантомное чтение. Ваш сервис должен быть транзакционным? Если не установлено transactional=false в сервисе.

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