|
|
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
Вот есть spring hibernate приложение. Обычно над сервисами написано @Transactional. Это значит, что всё что происходит в рамках любого метода этого класса будет происходить в рамках транзакции. Сервисы зависят от дао Дао методы написаны по такому шаблону: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. sessionFactory ответственна за то, чтобы выдавать нам сессию. Но как она нам её выдаёт? каждый раз создается новая сессия? Так же известно, что хибернейт внутри себя использует connection pool. Допустим при старте приложения создаётся 10 коннекшенов. В обычном jdbc коде всё это выглядит примерно так: Код: java 1. 2. 3. Я так понимаю сессия это примерно то же самое что и statement. Причем с одного коннекшена можно создать неограниченное число стэйтментов(сессий) Возникает вопрос зачем нам коннекшен пул? Также насколько я понял, сессия это всегда шире чем транзакция. Получается, что если в сервис методе мы вызываем несколько дао, то они будут выполнены в рамках одной сессии. Как сделать несколько транзакций в рамках одной сессии если не применять sess.beginTransaction() ? Ну и чувствую, что моё понимание не очень, поэтом прошу указать на мои заблуждения и объяснить как на самом деле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 13:12 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 13:28 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
questioner Так же известно, что хибернейт внутри себя использует connection pool. использует, но его не рукомендуют к продакшену. лучше брать стронний. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 13:58 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, BlazkowiczquestionerЯ так понимаю сессия это примерно то же самое что и statement. Вообще нет. Сессия это что-то типа Unit of Work. А зачем нужна эта абстракция? вот транзакция понятно зачем. Она должна либо выполниться целиком, либо не выполниться. По транзакция ведь тоже unit of work. Какой смысл в сессии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 16:50 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
questionerА зачем нужна эта абстракция? вот транзакция понятно зачем. Она должна либо выполниться целиком, либо не выполниться. По транзакция ведь тоже unit of work. Какой смысл в сессии? Вот тут кратко и по делу http://martinfowler.com/eaaCatalg/unitOfWork.html Можно ли выкинуть сессию и оставить только транзакцию? Можно. Выйдет ли это боком? Выйдет. И по производительности и по резолву конфликтов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 16:59 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 17:12 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
Интересно, кто букву съел... http://martinfowler.com/eaaCatalog/unitOfWork.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 17:25 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
questionerКакой смысл в сессии? Это сессия хибера. Как то ему надо различать Объект Васи от объекта Пети? Для это есть сессия Хибера в пределах которой одинаковый адрес двух объектов в памяти говорит об одинаковости этих объектов. Ещё контролирует изменение объекта своим счётчиком изменений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 17:29 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
questioner, ну или так: Код: java 1. 2. Так вот, в одной сессии хибера у Васи это будет один объект. Если А и Б в разных сесиях, то это разные объекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 17:41 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczИнтересно, кто букву съел... http://martinfowler.com/eaaCatalog/unitOfWork.html тут кажись перевод того самого текста) http://design-pattern.ru/patterns/unit-of-work.html Тут у меня ещё возник по ходу дела вопрос, который никогда меня не заботил) Вот считался в момент времени 1 объект О в потоке 1 в параллельном потоке в момент времени 2 вызвался другой метод, который считал тот же самый объект. В этом же потоке мы объект поменяли и засэйвили в момент времени 3. в первом потоке мы тоже поменяли объект и в момент времени 4 сэйвим его. Мы получим эксепшн? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 18:43 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
redwhite90Мы получим эксепшн?А он тебе нужен?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 19:11 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
redwhite90тут кажись перевод того самого текста) http://design-pattern.ru/patterns/unit-of-work.html Ну, такое. redwhite90Тут у меня ещё возник по ходу дела вопрос, который никогда меня не заботил) Вот считался в момент времени 1 объект О в потоке 1 в параллельном потоке в момент времени 2 вызвался другой метод, который считал тот же самый объект. В этом же потоке мы объект поменяли и засэйвили в момент времени 3. в первом потоке мы тоже поменяли объект и в момент времени 4 сэйвим его. Мы получим эксепшн? Смешались в кучу люди, кони... Есть объекты, есть сущности. Это немного разные вещи. При чем тут потоки, если речь была о сессиях и транзакциях? Нет, эксепшна не будет. Кто последний, тот и папа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 19:15 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
Petro123А он тебе нужен?) так получится же, что действия одного из потоков пропадут. небезопасно.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 19:42 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
questioner, ты же программист. А написать можно всё (с) У меня (не на хибере) есть оба варианта. И оба имеют свои недастатки: - А - пользователь получает сообщение "Пока вы думали и начали сохранять, ваша запись устарела (кто-то опередил)" - Б - он ничего не получает. AFAIK в хибере можно проверять версию и знать об изменении. Но это же оффтоп? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 19:58 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
questionerтак получится же, что действия одного из потоков пропадут. небезопасно.... В чем небезопасность? Целостность базы не нарушена. Всё безопасно. Проблема конфликтующих апдейтов решается через блокировки. Они могут быть пессимистичными - грабим запись при чтении и не даём другим читать, пока не проапдейтим (SELECT FOR UPDATE), либо оптимистичными - апдейт выкидывает эксепшн. Но это совсем отдельная тема я про неё уже много раз отвечал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2015, 20:04 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczquestionerтак получится же, что действия одного из потоков пропадут. небезопасно.... В чем небезопасность? Целостность базы не нарушена. Всё безопасно. Проблема конфликтующих апдейтов решается через блокировки. Они могут быть пессимистичными - грабим запись при чтении и не даём другим читать, пока не проапдейтим (SELECT FOR UPDATE), либо оптимистичными - апдейт выкидывает эксепшн. Но это совсем отдельная тема я про неё уже много раз отвечал. Спасибо, а линканёте на свои же ответы? Petro123 ты же программист. А написать можно всё (с) У меня (не на хибере) есть оба варианта. И оба имеют свои недастатки: - А - пользователь получает сообщение "Пока вы думали и начали сохранять, ваша запись устарела (кто-то опередил)" - Б - он ничего не получает. AFAIK в хибере можно проверять версию и знать об изменении. Но это же оффтоп? да, конечно оффтоп) просто я собрался узнать все интересующие меня вопросы в одном топике)) вот тут вроде прове версию. http://stackoverflow.com/a/6911033/2674303 хибер сам заботится о проверке версии или мы в коде должны что-то такое понаписать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 10:42 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 10:48 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
questionerхибер сам заботится о проверке версии или мы в коде должны что-то такое понаписать? нужно завести колонку в базе, а в маппинге и объвить версией сущности. http://docs.oracle.com/javaee/6/api/javax/persistence/Version.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 10:49 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, http://rsdn.ru/forum/java/3111049.1 Пессимистичная блокировка — все запросы выстраиваются в очередь. Кто последний тот и папа. Реализуется либо через SELECT FOR UPDATE , либо через synchronized. Это вариант имеет сразу несколько минусов в твоем случае: — пользователи перезатирают изменения друг друга. — запросы выполняются последовательно, что при большой нагрузке может стать bottleneck-ом. SELECT FOR UPDATE - блокировка на уровне базы. либо через synchronized - на уровне java вроде как оба эти варианта это авторзапросы выполняются последовательно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 12:32 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
questionerSELECT FOR UPDATE - блокировка на уровне базы. либо через synchronized - на уровне java Это вопрос или утверждение? Вроде, речь была в контексте Hibernate. Поэтому про базу ответ. А так, да. Оптимистические и пессимистические блокировки можно и на Java делать. Не обязательно в базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 12:42 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
questioner, Разница в БЛ: - либо вы не можете войти в редактирование (запись захвачена SELECT for update) - либо вы можете войти и ни о чём не подозреваете, но не можете сохранить (таймштамп изменился) Или: - нельзя нажать кнопку F2 - редактирвоать (Открыть форму для редактирования) - нельзя нажать кнопку - Сохранить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 12:56 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Blazkowicz,Это вопрос или утверждение? Вроде, речь была в контексте Hibernate. Поэтому про базу ответ. вопрос) Вы описали 2 варианта pessimistick lock. Blazkowicz— пользователи перезатирают изменения друг друга. — запросы выполняются последовательно, что при большой нагрузке может стать bottleneck-ом. авторSELECT FOR UPDATE - блокировка на уровне базы. либо через synchronized - на уровне java это оба пример авторзапросы выполняются последовательно, что при большой нагрузке может стать bottleneck-ом авторпользователи перезатирают изменения друг друга. Это видимо дефолтное поведение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 13:07 |
|
||
|
Spring hibernate. Как происходит управление сессиями, транзакциями?
|
|||
|---|---|---|---|
|
#18+
questionerЭто видимо дефолтное поведение? да LockMode.NONE не парьте мозги. Это веб, это пул и поэтому неизбежные издержки. Делайте так чтобы не пересекались)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 13:31 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39094503&tid=2124701]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
85ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 243ms |
| total: | 467ms |

| 0 / 0 |
