powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Session насколько правильно?
25 сообщений из 35, страница 1 из 2
Hibernate Session насколько правильно?
    #38195885
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используется Spring, Hibernate.
Вообщем, где-то я читал что создание сессии Hibernate на каждый запрос к БД не очень правильно.
Так вот, у меня из контроллера (MVC) вызываются методы, которые только читают данные из БД.
В основной массе эти методы работают через hibernateTemplate, т.е. примерный их вид следующий
Код: java
1.
2.
3.
public List getSomeData() {
   return hibernateTemplate.find("...");
}


Таких вызовов разных методов примерно 10-20 на один запрос к контроллеру. В итоге в логах я вижу:

Код: java
1.
2.
3.
[org.springframework.orm.hibernate3.SessionFactoryUtils][doGetSession][{{user,User name: test, id: 1}}] - Opening Hibernate Session
[org.springframework.orm.hibernate3.HibernateTemplate][flushIfNecessary][{{user,User name: test, id: 1}}] - Eagerly flushing Hibernate session
[org.springframework.orm.hibernate3.SessionFactoryUtils][closeSession][{user,User name: test, id: 1}}] - Closing Hibernate Session



Количество этих "блоков" соответствует количеству вызываемых методов.
Мне кажется, что это не совсем правильно, что создается по 20 сессий на один запрос.
Как это можно исправить? Обернуть все вызовы в одну транзакцию?
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38195964
Фотография dmitriyche
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,

Возможно найдёте ответ в этом топике .
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38195979
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriycherdm,

Возможно найдёте ответ в этом топике .
Спасибо за ссылку, но это не совсем то, о чем я спрашиваю)
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38195981
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,

Использовать паттерн Transaction Script aka Service. Но можно и на котроллеры навесить декларативные транзакции, смотреть мануал Spring про @Transactional.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38195984
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczrdm,

Использовать паттерн Transaction Script aka Service. Но можно и на котроллеры навесить декларативные транзакции, смотреть мануал Spring про @Transactional.
Я вас правильно понимаю, что иметь на один запрос к контроллеру 10-20 открытий-закрытий сессий Hibernate не правильно?
Т.е. я хочу с начало определиться с тем, что правильно это или нет.
Я его уже 2 раз читаю, но там скудно довольно.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38195991
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmЯ вас правильно понимаю, что иметь на один запрос к контроллеру 10-20 открытий-закрытий сессий Hibernate не правильно?

Ну, что значит "не правильно". Просто у вас 1 запрос к серверу = 20 запросов к базе = 20 транзакций. 19 запросов что-то поменяли, 20й выкинул исключение, в базе остались не валидные данные.

rdmТ.е. я хочу с начало определиться с тем, что правильно это или нет.
Обычно 1 запрос к серверу это одна, реже несколько, транзакций. Создавать сессию на каждый запрос, конечно же, оверхед. К тому-же сессия кеширует данные, которые вы, возможно, снова и снова перечитываете из базы.

rdmЯ его уже 2 раз читаю, но там скудно довольно.
1) Далаем чтобы контроллер имплементил интерфейс - со всеми транзакционными методами.
2) Прописываем на все методы @Transactional, если метод ничего не пишет в базу, то можно добавить readOnly=true
3) В Spring XML прописываем Transaction Manager, связываем его с хибером, включаем поддержку аннотаций для транзакций - примеров в инете валом.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38195997
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, наверно у меня некоторое не понимание вопроса. Дело в том, что я не создаю транзакций. Все 20 вызов идут без создания транзакций, без участия менеджера транзакций. Если я правильно понимаю одна сессия hibernate != одна транзакция.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38195999
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот исходный код hibernateTemplate.find()
Я правильно понимаю, что тут нет никакой транзакции(типа tx.begin())?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public List find(final String queryString, final Object... values) throws DataAccessException {
	return executeWithNativeSession(new HibernateCallback<List>() {
 			public List doInHibernate(Session session) throws HibernateException {
 				Query queryObject = session.createQuery(queryString);
 				prepareQuery(queryObject);
 				if (values != null) {
 					for (int i = 0; i < values.length; i++) {
 						queryObject.setParameter(i, values[i]);
 					}
 				}
 				return queryObject.list();
 			}
 		});
 	}
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196003
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОбычно 1 запрос к серверу это одна, реже несколько, транзакций. Создавать сессию на каждый запрос, конечно же, оверхед.

Так вот, а если мне нужно на один запрос к контроллеру сделать 20 запросов к БД, без требований транзакционности, с учетом вашего замечания про оверхед.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196021
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmнаверно у меня некоторое не понимание вопроса. Дело в том, что я не создаю транзакций. Все 20 вызов идут без создания транзакций
Все 20 запросов идут в 20 транзакциях БД.

rdmЕсли я правильно понимаю одна сессия hibernate != одна транзакция.
По-умолчанию одна сессия=одна транзакция. Это не догма, можно настроить как надо.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196030
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196036
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmBlazkowicz, спасибо за внимание к моим вопросам ) Пока полная картина у меня как=то не складывается)
блин, что непонятного, тебе нужно прикрутить декларативные транзакции (через аннотацию или конфиг) так, чтобы каждое логически обособленное действие выполнялось в рамках этой транзакции. ну например
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class UserServiceImpl implements UserService {
@Transactional
public void addUser(User user) {
   if (userDao.notExists(user)) {
      userDao.save(user);
      logDao.recordAddUser(user);
      someOtherDao.createDefaultSettingsForUser(user);
   }
}
}


каждый из методов внутри addUser обращается к бд, но не открывает сессий и не закрывает их, а запрашивает всегда текущую.
и вот тогда они в данном конкретном случае будут действовать в рамках одной сессии и транзакции, хотя будучи использованы в каком-то другом месте могут иметь свою сессию и транзакцию
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196048
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, это я понимаю. Как сделать тоже самое без @Transactional(либо tx:advice)? Можно?
Т.е. одна сессия, много запросов к БД, но без транзакции. Такое возможно?
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196063
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmchpasha, это я понимаю. Как сделать тоже самое без @Transactional(либо tx:advice)? Можно?
Можно XML конфигом сказать все методы этих классов, этого пакета, с таким патерном сделать транзакционными.

rdmТ.е. одна сессия, много запросов к БД, но без транзакции. Такое возможно?
Чо за "без транзакции"? Цель "без транзакции" какая?
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196086
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, вот этого я и не понимаю собственно) Я видимо наивно полагал что транзакция, это как дополнительная опция, так сказать по желанию.
Т.е. можно сделать скажем вставку в БД (insert), но если разработчику хочется он может эту вставку обернуть в транзакцию.
Из сказанного я делаю вывод, что любая операция(CRUD) или последовательность операций с БД в любом случае будет происходить внутри минимум одной транзакции. Другими словами, что операция с БД вне транзакции невозможны?
Но в том же доке Spring'а идет речь о скажем propagation.NOT_SUPPORTED. Т.е. действия должны выполнять вне транзакции.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196091
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmBlazkowicz, вот этого я и не понимаю собственно) Я видимо наивно полагал что транзакция, это как дополнительная опция, так сказать по желанию.
Т.е. можно сделать скажем вставку в БД (insert), но если разработчику хочется он может эту вставку обернуть в транзакцию.
Из сказанного я делаю вывод, что любая операция(CRUD) или последовательность операций с БД в любом случае будет происходить внутри минимум одной транзакции.
Всё верное. Опция в JDBC так и называется Auto-Commit, значит что каждый запрос, будет коммитить транзакцию.
Чтобы получить одну транзакцию на несколько запросов Auto-Commit нужно отключить.
rdmДругими словами, что операция с БД вне транзакции невозможны?
В общем случае - да. В частных, например, бывают не транзакционные базы.

rdmНо в том же доке Spring'а идет речь о скажем propagation.NOT_SUPPORTED. Т.е. действия должны выполнять вне транзакции.
Скорее вне компетенции текущего менеджера транзакций.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196097
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, тогда получается что термин "транзакция" используется некорректно.

ВикиТранза́кция (англ. transaction) — группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными.


Получается, что один insert это "группа последовательных операций" и является транзакцией?
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196101
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczrdmНо в том же доке Spring'а идет речь о скажем propagation.NOT_SUPPORTED. Т.е. действия должны выполнять вне транзакции.
Скорее вне компетенции текущего менеджера транзакций.
Так если любой действие является транзакцией, получается что propagation.NOT_SUPPORTED эквивалент propagation.REQUIRED_NEW в данном случае? Т.е. если не в текущей транзакции, то в новой.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196106
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmBlazkowicz, тогда получается что термин "транзакция" используется некорректно.

ВикиТранза́кция (англ. transaction) — группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными.


Получается, что один insert это "группа последовательных операций" и является транзакцией?
Википедия такая википедия. Читайте хотя бы английскую.
http://en.wikipedia.org/wiki/Database_transaction
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196108
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmТак если любой действие является транзакцией

Хватит всё в кучу мешать. Любая операция с транзакционной БД выполняется в транзакции.

И тут мы вдруг заговорили про транзакции Spring.
rdmполучается что propagation.NOT_SUPPORTED эквивалент propagation.REQUIRED_NEW в данном случае? Т.е. если не в текущей транзакции, то в новой.
Не вижу ничего эквивалетного.

Нужно различать транзакции, которые происходят в базе и которые происходят в контейнере.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196116
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196119
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczrdmТак если любой действие является транзакцией

Хватит всё в кучу мешать. Любая операция с транзакционной БД выполняется в транзакции.

И тут мы вдруг заговорили про транзакции Spring.
rdmполучается что propagation.NOT_SUPPORTED эквивалент propagation.REQUIRED_NEW в данном случае? Т.е. если не в текущей транзакции, то в новой.
Не вижу ничего эквивалетного.

Нужно различать транзакции, которые происходят в базе и которые происходят в контейнере.
метод с NOT_SUPPORTED вызванный из метода с REQUIRED, со стороны БД будет новой транзакцией.
метод с REQUIRED_NEW вызванный из метода с REQUIRED, со стороны БД будет новой транзакцией.
В чем разница?
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196123
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя может это отличия "Nested transactions, for example, are transactions which contain statements within them that start new transactions (i.e. sub-transactions)."
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196133
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmметод с NOT_SUPPORTED вызванный из метода с REQUIRED, со стороны БД будет новой транзакцией.
метод с REQUIRED_NEW вызванный из метода с REQUIRED, со стороны БД будет новой транзакцией.
В чем разница?
В том что в одном новую транзакцию создаст Transaction Manager, а в другом вы сами.
...
Рейтинг: 0 / 0
Hibernate Session насколько правильно?
    #38196139
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, вы не подскажите софт, который позволяет посмотреть обмен данными между драйвером JDBC и БД, как это все происходит на уровне протокола.
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Session насколько правильно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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