Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring hibernate. Как происходит управление сессиями, транзакциями? / 24 сообщений из 24, страница 1 из 1
04.11.2015, 13:12
    #39094376
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring hibernate. Как происходит управление сессиями, транзакциями?
Вот есть 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
04.11.2015, 13:28
    #39094386
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring hibernate. Как происходит управление сессиями, транзакциями?
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
04.11.2015, 13:58
    #39094390
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring hibernate. Как происходит управление сессиями, транзакциями?
questioner
Так же известно, что хибернейт внутри себя использует connection pool.



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



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

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

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

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

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

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


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

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

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

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

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

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

Ну, такое.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

вопрос)

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

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

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

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

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

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

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


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