0

Я пытаюсь понять значение «Спящий сеанс не является потокобезопасным». Что я уже знаю (пожалуйста, поправьте меня, если я ошибаюсь):Спящий сеанс и безопасность потока

  1. Сессия в среде, отличной от JTA, сохраняется в потоке Local. Поэтому он привязан к текущей теме.
  2. Вызов getCurrentSession() в новом потоке свяжет новый сеанс со своим собственным потоком local.
  3. Предположим, мы разделяем сущность между двумя потоками (T1, T2), загруженными в T1 и используемыми в T2, у нас могут быть проблемы с ленивой загрузкой и т. Д., Потому что сеансы в T1 и T2 различны.

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

То, что я не понимаю, это проблемы, которые могут возникнуть, когда сеанс разделяется между двумя и более потоками. Я знаю, что методы в сеансе не являются потокобезопасными и могут вызывать расовые условия и т. Д., Но неясно, как? Я был бы очень признателен, если бы кто-нибудь мог объяснить с примерами или перечислить один или несколько сценариев, чтобы уточнить.

Заранее спасибо

ответ

2

Java memory model имеет очень строгие правила:

  • видимости памяти межпоточной
  • операций резьбы переупорядочивания

Объект Session не поточно- , что означает, что он никогда не предназначался для доступа более чем одним потоком. Для этого он использует не поточно-механизма:

  • нет мьютекса
  • не летучего не читает
  • нет синхронизации

Если вы разделяли Hibernate Session между двумя нитями, затем изменяет один нить может быть недоступен для какого-либо другого потока (без правильной синхронизации или волатильных чтений).

Каждый сеанс Hibernate получает связанное соединение JDBC (даже в конце концов JTA-агрессивный релиз, повторно использующий одно и то же соединение JDBC для всех операторов, выпущенных одним транзакционным транзакцией JTA DataSource). Соединение JDBC нельзя использовать двумя потоками, потому что каждый поток должен быть привязан к одной и только одной транзакции базы данных.

+0

Спасибо Влад. Есть ли пример или сценарий приложения, как все может пойти не так? Это поможет мне дальше. – Mustafa

+0

У меня нет никакого примера, но вы можете легко попробовать его сами. –

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