Безопасен ли сеанс сеанса Hibernate?

Мне нужно знать, является ли сеанс Hibernate безопасным потоком или нет. Но очевидный новый сеанс прикреплен к каждому потоку для выполнения. Но мой вопрос заключается в том, что в одном потоке я обновил некоторое значение сущности, так что это будет отражено в другом потоке во время выполнения одного и того же времени?

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

например. текущий этап таблицы.

  ID      NAME      MARKS
------- --------- --------
  1       John       54

Я пытаюсь сделать follwing:

Student student = session.load(Student.class, 1);
student.setMarks(student.getMarks() + 1);
session.update(student);
session.close();

Когда я пытаюсь запустить вышеуказанный код в цикле, скажем 10, тогда значение "меток" в таблице "ученик" будет правильно обновлено, т.е. значение будет обновлено до 64, что является правильным.

Но когда я пытаюсь запустить тот же код в потоковой среде, он дает плохие результаты.

Ответы

Ответ 1

Не предполагается, что разработчики являются потокобезопасными. Вместо этого каждый поток/транзакция должен получить свой собственный экземпляр из SessionFactory.

Даже учитывая это, ваше поведение может все еще не быть тем, что вы ожидаете, поскольку транзакции вступают в игру. Вам нужно будет установить надлежащий уровень изоляции транзакций. См. Руководство по конфигурации , hibernate.connection.isolation.

Ответ 2

Спящий сеанс и потоки не смешиваются.

Вы не должны использовать сеанс из нескольких потоков одновременно, и я рекомендую вам использовать сеанс только из одного потока. Реализации сеансов БД даже не требуется, чтобы быть безопасным.

Вы также должны учитывать, что происходит с транзакциями, когда вы начинаете делать что-то в нескольких потоках. Транзакции привязаны к текущей теме. Это быстро ускоряется, и вы вводите области, в которых разработчики не тестировали свои продукты.

В конце жизнь слишком коротка, чтобы заблудиться в этом болоте.

Ответ 3

Спящий режим не является потокобезопасным. Используйте класс TheadLocal для создания сеансов для каждого потока: -

 private static ThreadLocal<Session> threadSafeSession = new ThreadLocal<Session>() {
    protected Session initialValue(){
    return sf.openSession();
      }
    };

В вашем методе получить сеанс для каждого потока как: -

Session session = threadSafeSession.get();

Ответ 4

Это зависит от того, как вы создаете сеанс.

Сессия может быть создана двумя способами в спящем режиме.

  • getCurrentSession()

Да. Он обеспечивает безопасность потоков, поскольку он обеспечит создание сеанса для каждого потока, если сеанс не существует. транзакция и автоматическое закрытие сеанса.

  1. openSession()

Это не безопасный поток. разработчик вручную должен управлять транзакциями и сеансами закрытия и закрытия.