2016-11-14 9 views
1

При использовании prototype области видимости Session с @Transactional аннотацию в SDN 4.1.x, я видя следующее исключение:org.neo4j.ogm.exception.TransactionManagerException: «Сделка не является текущей для этой нити», когда сеанс используется в рамках прототипа

org.neo4j.ogm.exception.TransactionManagerException: "Transaction is not current for this thread" 

Я недавно модернизировал свой Spring загрузки проекта в SDN 4.1.x и Neo4j OGM 2.0.3. Кажется, что когда инициировано несколько Session s (из-за того, что область prototype) DefaultTransactionManager не может найти ссылку на ранее открытую транзакцию во время фиксации.

Я вижу, что статический ThreadLocal удаляется каждый раз, когда сеанс создается.

Но тот же проект отлично работает с SDN 4.0.0 и версией OGM 1.1.4. Так что, как работа вокруг, мне пришлось сделать Sessionthread в области. Кто-нибудь может прояснить, какие изменения внесены в SDN/OGM, которые могут вызвать это. Или это ожидаемое поведение в SDN 4.1.X?

+0

Вы обновляетесь с OGM 1.x до 2.x. В этом было много серьезных изменений. OGM 2.0.x разрешил использование сеансов «thread», однако моя рекомендация заключалась бы в том, чтобы не использовать это. Что вы пытаетесь достичь, что требует хранения всех объектов базы данных в памяти на протяжении всего срока службы приложения? Я бы настоятельно рекомендовал перейти на SDN 4.2/OGM 2.1, если вы обновляетесь, так как в этих выпусках значительно больше изменений, чем 4.1/2.0. – digx1

+0

Я добавил дополнительную информацию в раздел «Ответ». Пожалуйста, дайте мне знать ваши взгляды на то же самое. – Sourav

ответ

0

Спасибо за ответ.

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

Параллелизм контролируется API-интерфейсом Reactor-Stream на основе группировки на основе пула. Это означает, что данные хранятся в Neo4J через параллельные потоки (рабочие) из нескольких групп (пул потоков), созданных на основе определенного контекста группировки конкретных приложений. Внутри группы взаимодействие с Neo4J всегда последовательное.

Соответственно, ниже приведены варианты, которые я рассмотрел для Neo4j сессии (я использовал @EnableTransactionManagement в конфигурации и @Transactional в методе, взаимодействующего с Neo4j)

  1. "session" - Это не может быть использован в качестве приложения (в основном бэкэнд-приложение) не использует контейнер Spring-MVC
  2. "prototype" - означает, что для каждого попадания базы данных будет создан новый объект сеанса. Это хорошо работает с SDN 4.0.0 и OGM 1.x. Но с обновленной библиотекой он больше не работает. Сессия управляется контейнером и не используется далее за пределами границ транзакции
  3. "thread" - Для этого требуется явная регистрация области. Тем не менее, сеанс остается в живых, хотя весь жизненный цикл потока. Это действительно расширит область памяти и будет очищаться/краснеть, чтобы сохранить целостность данных.

Я думал об обновлении до SDN 4.2.X, но доступны только SNAPSHOT, которые я немного скептически продолжаю.

Кроме того, я вижу, что когда аспект транзакции (@EnableTransactionManagement) удален, он отлично работает. Но мне интересно, правильно ли он обрабатывает транзакцию.

Тип путаницы при управлении транзакциями вокруг OOM Neo4J, в котором сеанс не может быть инициализирован в Singleton или Session scope? Или Какая предпочтительная работа вокруг таких сценариев?

+0

Возможно, вы должны перенести это на вопрос, потому что это не ответ. – digx1

+0

Также, как я упомянул в своем ответе, вы никогда не должны больше определять * сессию '@ Bean' или связанный с ней объект. Все, что вам нужно сделать, это определить '@Autowired Session session' в любом управляемом Spring' @ Component' или '@ Service' и т. Д. (Просто убедитесь, что вы используете' @ Transactional' или 'TransactionTemplate' при взаимодействии с сеансом для использования Управление транзакциями Spring с ним). Важная вещь, чтобы окунуться в голову, когда вы это делаете, заключается в том, что введенный бит 'Session' фактически проксирован. Если он уже существует в контексте транзакции, он использует один и тот же компонент. – digx1

0

OK Я думаю, что понимаю проблемы.

До SDN 4.2/OGM 2.1 Конфигурация и транзакции выполнялись по-разному. Пользователям необходимо было определить и указать область на компоненте в классе конфигурации, который расширился Neo4jConfiguration. Это привело к большой путанице среди разработчиков, с точки зрения которых можно использовать для своих приложений. В этой последней версии это полностью устранено. Вы можете посмотреть, как обновить номер this blog post. Мы также не будем поддерживать этот старый механизм конфигурации в будущем.

Новая версия SDN будет RC1 в конце этого месяца и RELEASE около 12 декабря, так что это не будет SNAPSHOT слишком долго!

В сообщении в блоге также говорится о том, как работают транзакции.

+0

Хорошо. Я предпочел бы планировать еще один раунд миграции после того, как будет доступна ГА. До того времени, когда мне придется жить с SDN 4.1.3.RELEASE и OGM 2.0.5. Итак, что вы берете на себя с помощью области «Тема» с session.clear() перед каждым рабочим блоком. (код внутри @Transional)? Это единственная доступная работа, которую я вижу на данный момент. – Sourav

 Смежные вопросы

  • Нет связанных вопросов^_^