.persist () не работает в Spring Roo в новом потоке - PullRequest
2 голосов
/ 18 февраля 2012

У меня есть стандартный проект Spring Roo (1.2.0.RC1) со стандартными объектами домена.В моем основном потоке (контроллер домена) я могу создавать экземпляры объектов домена, поддерживаемых базой данных (я использую Hibernate / MySQL), используя средство поиска, изменять некоторые свойства и сохранять изменения обратно в БД, вызывая .persist ()на случаях, которые будут сохранены.

Если я переместлю всю эту логику в Runnable и выполню ее в новом потоке (вызывается ScheduledThreadPoolExecutor.scheduleAtFixedRate ()), я все равно смогу правильно создавать экземпляры объектов домена, используя средство поиска, но изменяя некоторыеСвойства и вызов .persist () для сохраняемых объектов не влияет на БД.Я не вижу ничего в журнале консоли (работает внутри STS).Я не знаю, есть ли какие-либо другие файлы журналов, которые создает Roo, которые могли бы дать мне дополнительные подсказки относительно того, что могло бы происходить.Кто-нибудь еще сталкивался с вышеупомянутой проблемой?Кто-нибудь знает, как получить более подробное ведение журнала в консоли STS (например, ведение журнала запросов Hibernate) для Roo?

1 Ответ

0 голосов
/ 23 марта 2012

Это связано с транзакцией.По умолчанию в Hibernate или JTA в этом отношении используются локальные транзакции, которые связаны с потоком.На самом деле, вы не должны пытаться разделять транзакции между потоками.Любые объекты, которыми вы делитесь между потоками (сеанс гибернации?), Держу пари, они на самом деле не безопасны для потоков.

Я бы попытался упростить ваш код и не обрабатывать обновления в нескольких потоках.Если вы ДОЛЖНЫ использовать несколько потоков, каждый из них должен иметь свои собственные транзакции.

Скорее всего, вам просто нужна новая транзакция для каждого потока.Но именно поэтому вы можете выбрать данные из своих потоков, но вы не можете сохранить.Похоже, транзакции внутри ваших потоков не закрываются.

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