|
|
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
Используется Spring, Hibernate. Вообщем, где-то я читал что создание сессии Hibernate на каждый запрос к БД не очень правильно. Так вот, у меня из контроллера (MVC) вызываются методы, которые только читают данные из БД. В основной массе эти методы работают через hibernateTemplate, т.е. примерный их вид следующий Код: java 1. 2. 3. Таких вызовов разных методов примерно 10-20 на один запрос к контроллеру. В итоге в логах я вижу: Код: java 1. 2. 3. Количество этих "блоков" соответствует количеству вызываемых методов. Мне кажется, что это не совсем правильно, что создается по 20 сессий на один запрос. Как это можно исправить? Обернуть все вызовы в одну транзакцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 14:22:24 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 16:52:25 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
dmitriycherdm, Возможно найдёте ответ в этом топике . Спасибо за ссылку, но это не совсем то, о чем я спрашиваю) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 17:28:19 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
rdm, Использовать паттерн Transaction Script aka Service. Но можно и на котроллеры навесить декларативные транзакции, смотреть мануал Spring про @Transactional. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 17:29:40 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczrdm, Использовать паттерн Transaction Script aka Service. Но можно и на котроллеры навесить декларативные транзакции, смотреть мануал Spring про @Transactional. Я вас правильно понимаю, что иметь на один запрос к контроллеру 10-20 открытий-закрытий сессий Hibernate не правильно? Т.е. я хочу с начало определиться с тем, что правильно это или нет. Я его уже 2 раз читаю, но там скудно довольно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 17:39:44 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
rdmЯ вас правильно понимаю, что иметь на один запрос к контроллеру 10-20 открытий-закрытий сессий Hibernate не правильно? Ну, что значит "не правильно". Просто у вас 1 запрос к серверу = 20 запросов к базе = 20 транзакций. 19 запросов что-то поменяли, 20й выкинул исключение, в базе остались не валидные данные. rdmТ.е. я хочу с начало определиться с тем, что правильно это или нет. Обычно 1 запрос к серверу это одна, реже несколько, транзакций. Создавать сессию на каждый запрос, конечно же, оверхед. К тому-же сессия кеширует данные, которые вы, возможно, снова и снова перечитываете из базы. rdmЯ его уже 2 раз читаю, но там скудно довольно. 1) Далаем чтобы контроллер имплементил интерфейс - со всеми транзакционными методами. 2) Прописываем на все методы @Transactional, если метод ничего не пишет в базу, то можно добавить readOnly=true 3) В Spring XML прописываем Transaction Manager, связываем его с хибером, включаем поддержку аннотаций для транзакций - примеров в инете валом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 18:08:55 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, наверно у меня некоторое не понимание вопроса. Дело в том, что я не создаю транзакций. Все 20 вызов идут без создания транзакций, без участия менеджера транзакций. Если я правильно понимаю одна сессия hibernate != одна транзакция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 18:19:17 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
Вот исходный код hibernateTemplate.find() Я правильно понимаю, что тут нет никакой транзакции(типа tx.begin())? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 18:23:23 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczОбычно 1 запрос к серверу это одна, реже несколько, транзакций. Создавать сессию на каждый запрос, конечно же, оверхед. Так вот, а если мне нужно на один запрос к контроллеру сделать 20 запросов к БД, без требований транзакционности, с учетом вашего замечания про оверхед. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 18:29:58 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
rdmнаверно у меня некоторое не понимание вопроса. Дело в том, что я не создаю транзакций. Все 20 вызов идут без создания транзакций Все 20 запросов идут в 20 транзакциях БД. rdmЕсли я правильно понимаю одна сессия hibernate != одна транзакция. По-умолчанию одна сессия=одна транзакция. Это не догма, можно настроить как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 19:20:57 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, спасибо за внимание к моим вопросам ) Пока полная картина у меня как=то не складывается) Hibernate DocThis is an anti-pattern of opening and closing a Session for each database call in a single thread. All communication with a database must be encapsulated by a transaction. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 19:36:16 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
rdmBlazkowicz, спасибо за внимание к моим вопросам ) Пока полная картина у меня как=то не складывается) блин, что непонятного, тебе нужно прикрутить декларативные транзакции (через аннотацию или конфиг) так, чтобы каждое логически обособленное действие выполнялось в рамках этой транзакции. ну например Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. каждый из методов внутри addUser обращается к бд, но не открывает сессий и не закрывает их, а запрашивает всегда текущую. и вот тогда они в данном конкретном случае будут действовать в рамках одной сессии и транзакции, хотя будучи использованы в каком-то другом месте могут иметь свою сессию и транзакцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 20:11:57 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
chpasha, это я понимаю. Как сделать тоже самое без @Transactional(либо tx:advice)? Можно? Т.е. одна сессия, много запросов к БД, но без транзакции. Такое возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 20:34:57 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
rdmchpasha, это я понимаю. Как сделать тоже самое без @Transactional(либо tx:advice)? Можно? Можно XML конфигом сказать все методы этих классов, этого пакета, с таким патерном сделать транзакционными. rdmТ.е. одна сессия, много запросов к БД, но без транзакции. Такое возможно? Чо за "без транзакции"? Цель "без транзакции" какая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 20:54:54 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, вот этого я и не понимаю собственно) Я видимо наивно полагал что транзакция, это как дополнительная опция, так сказать по желанию. Т.е. можно сделать скажем вставку в БД (insert), но если разработчику хочется он может эту вставку обернуть в транзакцию. Из сказанного я делаю вывод, что любая операция(CRUD) или последовательность операций с БД в любом случае будет происходить внутри минимум одной транзакции. Другими словами, что операция с БД вне транзакции невозможны? Но в том же доке Spring'а идет речь о скажем propagation.NOT_SUPPORTED. Т.е. действия должны выполнять вне транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 21:15:41 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
rdmBlazkowicz, вот этого я и не понимаю собственно) Я видимо наивно полагал что транзакция, это как дополнительная опция, так сказать по желанию. Т.е. можно сделать скажем вставку в БД (insert), но если разработчику хочется он может эту вставку обернуть в транзакцию. Из сказанного я делаю вывод, что любая операция(CRUD) или последовательность операций с БД в любом случае будет происходить внутри минимум одной транзакции. Всё верное. Опция в JDBC так и называется Auto-Commit, значит что каждый запрос, будет коммитить транзакцию. Чтобы получить одну транзакцию на несколько запросов Auto-Commit нужно отключить. rdmДругими словами, что операция с БД вне транзакции невозможны? В общем случае - да. В частных, например, бывают не транзакционные базы. rdmНо в том же доке Spring'а идет речь о скажем propagation.NOT_SUPPORTED. Т.е. действия должны выполнять вне транзакции. Скорее вне компетенции текущего менеджера транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 21:22:36 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, тогда получается что термин "транзакция" используется некорректно. ВикиТранза́кция (англ. transaction) — группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными. Получается, что один insert это "группа последовательных операций" и является транзакцией? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 21:35:52 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrdmНо в том же доке Spring'а идет речь о скажем propagation.NOT_SUPPORTED. Т.е. действия должны выполнять вне транзакции. Скорее вне компетенции текущего менеджера транзакций. Так если любой действие является транзакцией, получается что propagation.NOT_SUPPORTED эквивалент propagation.REQUIRED_NEW в данном случае? Т.е. если не в текущей транзакции, то в новой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 21:39:44 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
rdmBlazkowicz, тогда получается что термин "транзакция" используется некорректно. ВикиТранза́кция (англ. transaction) — группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными. Получается, что один insert это "группа последовательных операций" и является транзакцией? Википедия такая википедия. Читайте хотя бы английскую. http://en.wikipedia.org/wiki/Database_transaction ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 21:54:33 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
rdmТак если любой действие является транзакцией Хватит всё в кучу мешать. Любая операция с транзакционной БД выполняется в транзакции. И тут мы вдруг заговорили про транзакции Spring. rdmполучается что propagation.NOT_SUPPORTED эквивалент propagation.REQUIRED_NEW в данном случае? Т.е. если не в текущей транзакции, то в новой. Не вижу ничего эквивалетного. Нужно различать транзакции, которые происходят в базе и которые происходят в контейнере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 21:57:54 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrdmBlazkowicz, тогда получается что термин "транзакция" используется некорректно. пропущено... Получается, что один insert это "группа последовательных операций" и является транзакцией? Википедия такая википедия. Читайте хотя бы английскую. http://en.wikipedia.org/wiki/Database_transaction Во-во, это теплее ) WikiA single transaction consists of one or more independent units of work, each reading and/or writing information to a database or other data store. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 22:09:32 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrdmТак если любой действие является транзакцией Хватит всё в кучу мешать. Любая операция с транзакционной БД выполняется в транзакции. И тут мы вдруг заговорили про транзакции Spring. rdmполучается что propagation.NOT_SUPPORTED эквивалент propagation.REQUIRED_NEW в данном случае? Т.е. если не в текущей транзакции, то в новой. Не вижу ничего эквивалетного. Нужно различать транзакции, которые происходят в базе и которые происходят в контейнере. метод с NOT_SUPPORTED вызванный из метода с REQUIRED, со стороны БД будет новой транзакцией. метод с REQUIRED_NEW вызванный из метода с REQUIRED, со стороны БД будет новой транзакцией. В чем разница? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 22:15:14 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
Хотя может это отличия "Nested transactions, for example, are transactions which contain statements within them that start new transactions (i.e. sub-transactions)." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 22:25:37 |
|
||
|
Hibernate Session насколько правильно?
|
|||
|---|---|---|---|
|
#18+
rdmметод с NOT_SUPPORTED вызванный из метода с REQUIRED, со стороны БД будет новой транзакцией. метод с REQUIRED_NEW вызванный из метода с REQUIRED, со стороны БД будет новой транзакцией. В чем разница? В том что в одном новую транзакцию создаст Transaction Manager, а в другом вы сами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 22:36:25 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38195984&tid=2129711]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 305ms |
| total: | 485ms |

| 0 / 0 |
