Безопасен ли сеанс сеанса 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
Это зависит от того, как вы создаете сеанс.
Сессия может быть создана двумя способами в спящем режиме.
Да. Он обеспечивает безопасность потоков, поскольку он обеспечит создание сеанса для каждого потока, если сеанс не существует. транзакция и автоматическое закрытие сеанса.
- openSession()
Это не безопасный поток. разработчик вручную должен управлять транзакциями и сеансами закрытия и закрытия.