powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring hibernate. Как происходит управление сессиями, транзакциями?
24 сообщений из 24, страница 1 из 1
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094376
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот есть spring hibernate приложение.

Обычно над сервисами написано @Transactional. Это значит, что всё что происходит в рамках любого метода этого класса будет происходить в рамках транзакции.

Сервисы зависят от дао

Дао методы написаны по такому шаблону:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Repository
public class MyDaoImpl implements MyDao {

	private SessionFactory sessionFactory;
     
        @Override
        public List<MyAdminUser> findAllAdminUsers() {
            Session session = sessionFactory.getCurrentSession();
            Query query = session.getNamedQuery("findAllAdminUsers");
            query.setParameter("userRole",UserRole.ROLE_ADMIN);
            return query.list();
       }
}



sessionFactory ответственна за то, чтобы выдавать нам сессию.

Но как она нам её выдаёт?
каждый раз создается новая сессия?

Так же известно, что хибернейт внутри себя использует connection pool.

Допустим при старте приложения создаётся 10 коннекшенов.

В обычном jdbc коде всё это выглядит примерно так:

Код: java
1.
2.
3.
conn = DriverManager.getConnection(DB_URL,USER,PASS);
Statement stmt = conn.createStatement();
stmt.executeQuery(sql);



Я так понимаю сессия это примерно то же самое что и statement.

Причем с одного коннекшена можно создать неограниченное число стэйтментов(сессий)

Возникает вопрос зачем нам коннекшен пул?

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

Как сделать несколько транзакций в рамках одной сессии если не применять sess.beginTransaction() ?

Ну и чувствую, что моё понимание не очень, поэтом прошу указать на мои заблуждения и объяснить как на самом деле.
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094386
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionersessionFactory ответственна за то, чтобы выдавать нам сессию.
Но как она нам её выдаёт?
каждый раз создается новая сессия?

Нет. Сессия выдаётся в зависимости от натроек TransactionManager. По-умолчанию, Spring ассоциирует сессию с транзакцией и в течении одной транзакции будет выдавать один и тот же экземпляр сессии. Тут важно правильно получать ссессию из Spring, а не создавать каждый раз новую.

questionerЯ так понимаю сессия это примерно то же самое что и statement.

Вообще нет. Сессия это что-то типа Unit of Work.

questionerПричем с одного коннекшена можно создать неограниченное число стэйтментов(сессий)
Возникает вопрос зачем нам коннекшен пул?

Потому что нельзя в одном connection выполнять одновременно несколько "стэйтментов".

questionerТакже насколько я понял, сессия это всегда шире чем транзакция.

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

questionerПолучается, что если в сервис методе мы вызываем несколько дао, то они будут выполнены в рамках одной сессии.

Если правильно получать ссылку на сессию.

questionerКак сделать несколько транзакций в рамках одной сессии если не применять sess.beginTransaction() ?
Например, использовать Propagation.

questionerНу и чувствую, что моё понимание не очень, поэтом прошу указать на мои заблуждения и объяснить как на самом деле.
Во-первых почитать Фаулера и других авторов по поводу DAO, Repository, Unit of Work и Transaction Script. Тогда будет некоторое понимание самих принципов работы без отсылок к Spring/Hibernate.
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094390
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questioner
Так же известно, что хибернейт внутри себя использует connection pool.



использует, но его не рукомендуют к продакшену. лучше брать стронний.
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094481
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,



BlazkowiczquestionerЯ так понимаю сессия это примерно то же самое что и statement.

Вообще нет. Сессия это что-то типа Unit of Work.

А зачем нужна эта абстракция?

вот транзакция понятно зачем. Она должна либо выполниться целиком, либо не выполниться. По транзакция ведь тоже unit of work.

Какой смысл в сессии?
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094491
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerА зачем нужна эта абстракция?
вот транзакция понятно зачем. Она должна либо выполниться целиком, либо не выполниться. По транзакция ведь тоже unit of work.
Какой смысл в сессии?
Вот тут кратко и по делу
http://martinfowler.com/eaaCatalg/unitOfWork.html

Можно ли выкинуть сессию и оставить только транзакцию? Можно. Выйдет ли это боком? Выйдет. И по производительности и по резолву конфликтов.
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094503
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094516
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, кто букву съел...
http://martinfowler.com/eaaCatalog/unitOfWork.html
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094524
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerКакой смысл в сессии?
Это сессия хибера.
Как то ему надо различать Объект Васи от объекта Пети?
Для это есть сессия Хибера в пределах которой одинаковый адрес двух объектов в памяти говорит об одинаковости этих объектов.
Ещё контролирует изменение объекта своим счётчиком изменений.
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094534
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,
ну или так:
Код: java
1.
2.
ПеременнаяА = Хибер.ДайОбъект(ID=15)
ПеременнаяB = Хибер.ДайОбъект(ID=15)


Так вот, в одной сессии хибера у Васи это будет один объект. Если А и Б в разных сесиях, то это разные объекты.
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094576
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczИнтересно, кто букву съел...
http://martinfowler.com/eaaCatalog/unitOfWork.html

тут кажись перевод того самого текста)

http://design-pattern.ru/patterns/unit-of-work.html

Тут у меня ещё возник по ходу дела вопрос, который никогда меня не заботил)

Вот считался в момент времени 1 объект О в потоке 1
в параллельном потоке в момент времени 2 вызвался другой метод, который считал тот же самый объект. В этом же потоке мы объект поменяли и засэйвили в момент времени 3.
в первом потоке мы тоже поменяли объект и в момент времени 4 сэйвим его.

Мы получим эксепшн?
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094597
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Мы получим эксепшн?А он тебе нужен?)
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094599
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90тут кажись перевод того самого текста)
http://design-pattern.ru/patterns/unit-of-work.html

Ну, такое.

redwhite90Тут у меня ещё возник по ходу дела вопрос, который никогда меня не заботил)

Вот считался в момент времени 1 объект О в потоке 1
в параллельном потоке в момент времени 2 вызвался другой метод, который считал тот же самый объект. В этом же потоке мы объект поменяли и засэйвили в момент времени 3.
в первом потоке мы тоже поменяли объект и в момент времени 4 сэйвим его.

Мы получим эксепшн?

Смешались в кучу люди, кони...
Есть объекты, есть сущности. Это немного разные вещи.
При чем тут потоки, если речь была о сессиях и транзакциях?

Нет, эксепшна не будет. Кто последний, тот и папа.
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094609
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123А он тебе нужен?)

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

небезопасно....
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094614
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,
ты же программист. А написать можно всё (с)
У меня (не на хибере) есть оба варианта. И оба имеют свои недастатки:
- А - пользователь получает сообщение "Пока вы думали и начали сохранять, ваша запись устарела (кто-то опередил)"
- Б - он ничего не получает.
AFAIK в хибере можно проверять версию и знать об изменении.
Но это же оффтоп?
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094616
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerтак получится же, что действия одного из потоков пропадут.
небезопасно....

В чем небезопасность? Целостность базы не нарушена. Всё безопасно.
Проблема конфликтующих апдейтов решается через блокировки. Они могут быть пессимистичными - грабим запись при чтении и не даём другим читать, пока не проапдейтим (SELECT FOR UPDATE), либо оптимистичными - апдейт выкидывает эксепшн.

Но это совсем отдельная тема я про неё уже много раз отвечал.
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094987
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestionerтак получится же, что действия одного из потоков пропадут.
небезопасно....

В чем небезопасность? Целостность базы не нарушена. Всё безопасно.
Проблема конфликтующих апдейтов решается через блокировки. Они могут быть пессимистичными - грабим запись при чтении и не даём другим читать, пока не проапдейтим (SELECT FOR UPDATE), либо оптимистичными - апдейт выкидывает эксепшн.

Но это совсем отдельная тема я про неё уже много раз отвечал.

Спасибо, а линканёте на свои же ответы?

Petro123 ты же программист. А написать можно всё (с)
У меня (не на хибере) есть оба варианта. И оба имеют свои недастатки:
- А - пользователь получает сообщение "Пока вы думали и начали сохранять, ваша запись устарела (кто-то опередил)"
- Б - он ничего не получает.
AFAIK в хибере можно проверять версию и знать об изменении.
Но это же оффтоп?

да, конечно оффтоп) просто я собрался узнать все интересующие меня вопросы в одном топике))
вот тут вроде прове версию.

http://stackoverflow.com/a/6911033/2674303

хибер сам заботится о проверке версии или мы в коде должны что-то такое понаписать?
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094992
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39094997
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerхибер сам заботится о проверке версии или мы в коде должны что-то такое понаписать?
нужно завести колонку в базе, а в маппинге и объвить версией сущности.
http://docs.oracle.com/javaee/6/api/javax/persistence/Version.html
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39098229
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,



http://rsdn.ru/forum/java/3111049.1 Пессимистичная блокировка — все запросы выстраиваются в очередь. Кто последний тот и папа. Реализуется либо через SELECT FOR UPDATE , либо через synchronized. Это вариант имеет сразу несколько минусов в твоем случае:
— пользователи перезатирают изменения друг друга.
— запросы выполняются последовательно, что при большой нагрузке может стать bottleneck-ом.

SELECT FOR UPDATE - блокировка на уровне базы.
либо через synchronized - на уровне java

вроде как оба эти варианта это авторзапросы выполняются последовательно
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39098245
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerSELECT FOR UPDATE - блокировка на уровне базы.
либо через synchronized - на уровне java
Это вопрос или утверждение? Вроде, речь была в контексте Hibernate. Поэтому про базу ответ.
А так, да. Оптимистические и пессимистические блокировки можно и на Java делать. Не обязательно в базе.
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39098267
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,
Разница в БЛ:
- либо вы не можете войти в редактирование (запись захвачена SELECT for update)
- либо вы можете войти и ни о чём не подозреваете, но не можете сохранить (таймштамп изменился)
Или:
- нельзя нажать кнопку F2 - редактирвоать (Открыть форму для редактирования)
- нельзя нажать кнопку - Сохранить
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39098280
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Blazkowicz,Это вопрос или утверждение? Вроде, речь была в контексте Hibernate. Поэтому про базу ответ.

вопрос)

Вы описали 2 варианта pessimistick lock.

Blazkowicz— пользователи перезатирают изменения друг друга.
— запросы выполняются последовательно, что при большой нагрузке может стать bottleneck-ом.

авторSELECT FOR UPDATE - блокировка на уровне базы.
либо через synchronized - на уровне java

это оба пример авторзапросы выполняются последовательно, что при большой нагрузке может стать bottleneck-ом

авторпользователи перезатирают изменения друг друга.
Это видимо дефолтное поведение?
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39098310
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЭто видимо дефолтное поведение?
да
LockMode.NONE
не парьте мозги. Это веб, это пул и поэтому неизбежные издержки.
Делайте так чтобы не пересекались)).
...
Рейтинг: 0 / 0
Spring hibernate. Как происходит управление сессиями, транзакциями?
    #39098441
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Petro123Делайте так чтобы не пересекались)).

Ну я конечно постараюсь)))
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring hibernate. Как происходит управление сессиями, транзакциями?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]