Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Session насколько правильно? / 25 сообщений из 35, страница 1 из 2
23.03.2013, 14:22:24
    #38195885
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Session насколько правильно?
Используется 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
23.03.2013, 16:52:25
    #38195964
dmitriyche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Session насколько правильно?
rdm,

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

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

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

Использовать паттерн Transaction Script aka Service. Но можно и на котроллеры навесить декларативные транзакции, смотреть мануал Spring про @Transactional.
Я вас правильно понимаю, что иметь на один запрос к контроллеру 10-20 открытий-закрытий сессий Hibernate не правильно?
Т.е. я хочу с начало определиться с тем, что правильно это или нет.
Я его уже 2 раз читаю, но там скудно довольно.
...
Рейтинг: 0 / 0
23.03.2013, 18:08:55
    #38195991
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Session насколько правильно?
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
23.03.2013, 18:19:17
    #38195997
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Session насколько правильно?
Blazkowicz, наверно у меня некоторое не понимание вопроса. Дело в том, что я не создаю транзакций. Все 20 вызов идут без создания транзакций, без участия менеджера транзакций. Если я правильно понимаю одна сессия hibernate != одна транзакция.
...
Рейтинг: 0 / 0
23.03.2013, 18:23:23
    #38195999
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Session насколько правильно?
Вот исходный код 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
23.03.2013, 18:29:58
    #38196003
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Session насколько правильно?
BlazkowiczОбычно 1 запрос к серверу это одна, реже несколько, транзакций. Создавать сессию на каждый запрос, конечно же, оверхед.

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

rdmЕсли я правильно понимаю одна сессия hibernate != одна транзакция.
По-умолчанию одна сессия=одна транзакция. Это не догма, можно настроить как надо.
...
Рейтинг: 0 / 0
23.03.2013, 19:36:16
    #38196030
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Session насколько правильно?
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
23.03.2013, 20:11:57
    #38196036
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Session насколько правильно?
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
23.03.2013, 20:34:57
    #38196048
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Session насколько правильно?
chpasha, это я понимаю. Как сделать тоже самое без @Transactional(либо tx:advice)? Можно?
Т.е. одна сессия, много запросов к БД, но без транзакции. Такое возможно?
...
Рейтинг: 0 / 0
23.03.2013, 20:54:54
    #38196063
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Session насколько правильно?
rdmchpasha, это я понимаю. Как сделать тоже самое без @Transactional(либо tx:advice)? Можно?
Можно XML конфигом сказать все методы этих классов, этого пакета, с таким патерном сделать транзакционными.

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

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

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


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

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


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

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

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

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

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

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

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


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