|
|
|
hibernate session and transaction
|
|||
|---|---|---|---|
|
#18+
Читаю вот здесь https://community.jboss.org/wiki/SessionsAndTransactions. вроде понятно логически а програмно API под описываемаю реализацию не могу найти Например я пользуюсь session-per-request-with-detached-objects pattern что в принципе логично достал объект отдал пользователю там пользователь порешал что то вернул данные где мы обновляем объект а вот интересует session-per-conversation pattern который в статье описан как достал объект и отдал пользователю, сессию отсоединил и положил в httpsession, дождался ответа от пользователя и закрепил flush новые данные. тут вот вопросы появляются поток в котором создавалась сессия скорее всего будет другим нежели тот в котором будет происходить flush если пользователь кликнет и вообще покинет страницу, получится что сессия застрянет не освободив ресурсы. как и от чего отсоединяется сессия есть вот такой API session.disconnect() которые возвращает Connection но я пробовал проверить и isConnected и isOpen возвращают true но он вроде как если только предоставил jdbc connection для создания сессии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2013, 18:19:46 |
|
||
|
hibernate session and transaction
|
|||
|---|---|---|---|
|
#18+
Я ни одного знака вопроса что-то не увидел :-) Если на пальцах, то conversation работает примерно так, как вы и описали. Сначала открывается сессия. Потом пользователь делает ряд действий, которые тут же применяются к этой сессии. Потом в самом конце происходит запись всех изменений в СУБД. Подход этот в целом плохой. Прежде всего тем, что между действиями пользователя сессия открыта. Более того, она может держать ряд локов в базе данных. В итоге такое вариант при внешне простоте совершенно не скалируется. Вот и все. А с какого потока вы работаете с сессией, никого не волнует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2013, 20:02:31 |
|
||
|
hibernate session and transaction
|
|||
|---|---|---|---|
|
#18+
если я не использую jta то сессии привязываются к потоку. в случае томката так как нет встроенного менеджера транзакций то сессии(Session object) привязываются к потокам. никакой гарантии нет что два запроса разнесенных во времени будут исполняться в одном потоке. если использовать session with detached object То никакого лока нет. достали данные из базы закрыли сессию отдали данные в ui. получили изменения из UI обновили detached object открыли новую сессию сделали merge или saveOrUpdate закрыли сессию. Две разные сессии, разные потоки. меня больше интересует что имелось ввиду под session-per-conversation pattern точнее как это реализовать в коде. идея в принципе понятна. Но есть но. Пока пользователь "думает", сессия в состоянии disconnected храниться в httpsession. Как только пользователь что то надумал и выполнил http request, то сессия достается из httpsession и восстанавливается соединение сессии - "каким то чудесным образом" и делается flush в БД. вот тут и загвозка что значит session disconnected? От чего дисконнектед. Какий метод вызвать чтобы получить сессию в disconnected state Как потом оживить сессию (точнее как сделать так чтобы во втором request метод session.flush не выбросил исключение) Где это API что позволить это сделать (Хоть пример привели бы в статье) при этом я вами согласен что сессию хранить открытой между http запросами не есть гуд, если не ошибаюсь в документации hibernate даже указано что сильно не рекомендуется так делать. только вот в статье которую я указал есть небольшое отличие в том сессия храниться в дисконнектед state ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2013, 21:32:19 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=192&tid=2127894]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
60ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 227ms |
| total: | 407ms |

| 0 / 0 |
