| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > hibernate запрос |
| Автор: SuperFly 21.11.2007, 18:37 |
| Еще раз, здравствуйте. Хотел узнать, как вы реализуете в JPA или Hibernate по 1 сессии на запрос? Есть стандартные решения или каждый делает своё? |
| Автор: SuperFly 22.11.2007, 15:04 |
| Видмо, я что-то не так спросил? Тема обсуждалась? |
| Автор: iluvatar 22.11.2007, 18:06 |
| ну, у меня 1 метод=1 запрос = 1 сессия |
| Автор: SuperFly 22.11.2007, 19:16 |
| Хм, я думаю этот вариант весьма жесткий. Представьте, над 1 проектом работают несколько программистов, я сомневаюсь, что они 1 методом договорятся. Необходим последовательный доступ к сессии из разных участков проекта (громко сказал, но учебный-проект тоже проект). |
| Автор: skhilkov 23.11.2007, 07:30 | ||
| SuperFly, используй пул соединений, например http://commons.apache.org/dbcp/ Добавлено @ 07:35
а что мешает создать еще сессию? по-моему, мы говорим о разных вещах... |
| Автор: skhilkov 23.11.2007, 12:25 |
| SuperFly, а ты не путаешь, случаем, сессию и соединение? |
| Автор: SuperFly 23.11.2007, 13:15 |
| skhilkov, Ууупс, конечно путаю! Добавлено через 1 минуту и 4 секунды Вообще неправильно все сказал :( Под запросом, имею ввиду запрос пользователя. Под сессией, всё таки как правильно заметили имею ввиду соединение. Добавлено через 2 минуты и 8 секунд Да, прошу прощения, совсем себя запутал. Добавлено через 8 минут и 48 секунд Я бы +1 поставил skhilkov, за наблюдательность. |
| Автор: Kangaroo 23.11.2007, 22:48 |
Я так понимаю, вопрос снят? Сейчас поставим ;) |
| Автор: SuperFly 15.1.2008, 14:23 | ||||
Хыыы, всё таки оказалось, что вопрос не снят! Я нашел то что задумал:
Чудесное свойство ThreadLocal!!! Ну и встал вопрос как мне стартовать транзакцию и коммитировать или роллбечить? У меня дума сделать фильтр:
Но, тут проблемка с роллбеком, где я должен его обрабатывать? |
| Автор: Greg 18.1.2008, 17:00 |
| Оборачивать каждый пользовательский запрос в транзакцию - неправильно. Даже если фильтр применяется не ко всем запросам - тоже неправильно. Создавать транзакцию нужно в классе, где реализуется работа с базой данных, там же фиксировать (commit) или откатывать (rollback). Настоятельно рекомендую читать про паттерн DAO (Data Access Object) и смотреть примеры. |
| Автор: Platon 22.1.2008, 12:33 |
| ... |
| Автор: Greg 3.2.2008, 14:54 | ||
Можно использовать реализацию паттерна Open Session In View из Spring framework - она инкапсулируется в фильтре org.springframework.orm.hibernate3.support.OpenSessionInViewFilter. Реализация паттерна привязывает объект org.hibernate.Session, к треду, в котором выполняется пользовательский запрос. Таким образом во время обработки пользовательского запроса разработчику не нужно заботиться о создании или освобождении сессии. |
| Автор: SuperFly 3.2.2008, 14:59 |
| Как понять моё цитирование? Теперь сами столкнулись с такой проблемой? Но, вы же сами предложили некое решение. |
| Автор: Greg 3.2.2008, 15:11 |
| В предыдущем сообщении я говорил про транзакции, потому что из Вашего примера они создаются раньше чем требуется. А сейчас я собственно ответил на первый Ваш вопрос. Подробней про паттерн можно прочитать на http://www.hibernate.org/43.html |
| Автор: SuperFly 3.2.2008, 15:19 |
| Аа, вот так то лучше, а то просто процитировали меня. Вот это уже интересней, спасибо за ответ! |
| Автор: Greg 3.2.2008, 15:43 |
| Пожалуйста. На самом деле я привык использовать Ctrl+Enter для перевода курсора на новую строку и по-моему одно время здесь редактор именно так работал. |