Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hibernate запрос, по одной сессии на запрос 
:(
    Опции темы
SuperFly
Дата 21.11.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



Еще раз, здравствуйте.

Хотел узнать, как вы реализуете в JPA  или Hibernate по 1 сессии на запрос?
Есть стандартные решения или каждый делает своё?
PM   Вверх
SuperFly
Дата 22.11.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



Видмо, я что-то не так спросил? Тема обсуждалась?
PM   Вверх
iluvatar
Дата 22.11.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



  ну, у меня 1 метод=1 запрос = 1 сессия
PM MAIL ICQ   Вверх
SuperFly
Дата 22.11.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



Хм, я думаю этот вариант весьма жесткий.

Представьте, над 1 проектом работают несколько программистов, я сомневаюсь, что они 1 методом договорятся. Необходим последовательный доступ к сессии из разных участков проекта (громко сказал, но учебный-проект тоже проект).
PM   Вверх
skhilkov
Дата 23.11.2007, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 371
Регистрация: 11.4.2006
Где: TOMSK

Репутация: 2
Всего: 7



SuperFly
используй пул соединений, например DBCP

Добавлено @ 07:35
Цитата(SuperFly @ 22.11.2007,  19:16)
Представьте, над 1 проектом работают несколько программистов, я сомневаюсь, что они 1 методом договорятся. Необходим последовательный доступ к сессии из разных участков проекта (громко сказал, но учебный-проект тоже проект).

а что мешает создать еще сессию? по-моему, мы говорим о разных вещах...

Это сообщение отредактировал(а) skhilkov - 23.11.2007, 07:35


--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
iluvatar
Дата 23.11.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



Цитата(skhilkov @  23.11.2007,  07:30 Найти цитируемый пост)

Цитата(SuperFly @ 22.11.2007,  19:16)
Представьте, над 1 проектом работают несколько программистов, я сомневаюсь, что они 1 методом договорятся. Необходим последовательный доступ к сессии из разных участков проекта (громко сказал, но учебный-проект тоже проект).

а что мешает создать еще сессию? по-моему, мы говорим о разных вещах...

я что-то тоже не понял.

Я тоже работаю в команде. И проблем не вижу. Делай метод, в который передаются все параметры, в зависимости от которых генерится запрос. создаешь сессию, выполняешь запрос, закрываешь сессию. Что здесь неправильно?

PM MAIL ICQ   Вверх
skhilkov
Дата 23.11.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 371
Регистрация: 11.4.2006
Где: TOMSK

Репутация: 2
Всего: 7



SuperFly,  а ты не путаешь, случаем, сессию и соединение?


--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
SuperFly
Дата 23.11.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



skhilkov, Ууупс, конечно путаю!

Добавлено через 1 минуту и 4 секунды
Вообще неправильно все сказал :(

Под запросом, имею ввиду запрос пользователя.
Под сессией, всё таки как правильно заметили имею ввиду соединение.

Добавлено через 2 минуты и 8 секунд
Да, прошу прощения, совсем себя запутал.

Добавлено через 8 минут и 48 секунд
Я бы +1 поставил skhilkov, за наблюдательность.
PM   Вверх
Kangaroo
Дата 23.11.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Цитата(SuperFly @  23.11.2007,  12:15 Найти цитируемый пост)
Да, прошу прощения, совсем себя запутал.

Я так понимаю, вопрос снят?

Цитата(SuperFly @  23.11.2007,  12:15 Найти цитируемый пост)
Я бы +1 поставил skhilkov, за наблюдательность. 

Сейчас поставим ;)


--------------------
Lost....
PM MAIL MSN   Вверх
SuperFly
Дата 15.1.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



Цитата(Kangaroo @  23.11.2007,  22:48 Найти цитируемый пост)
Я так понимаю, вопрос снят?

Хыыы, всё таки оказалось, что вопрос не снят!

Я нашел то что задумал:

Код

public class HibernateUtil {
    private static SessionFactory factory;
    private static AnnotationConfiguration aconf = new AnnotationConfiguration();
    private static final ThreadLocal threadSession = new ThreadLocal();
    private static final ThreadLocal threadTransaction = new ThreadLocal();

    public static Session getSession() {
        Session s = (Session) threadSession.get();
        if (s == null) {
            s = factory.openSession();
            threadSession.set(s);
        }
        return s;
    }

    public static void closeSession() {
        try {
            Session s = (Session) threadSession.get();
            threadSession.set(null);
            if (s != null && s.isOpen())
                s.close();
        } catch (HibernateException ex) {
            ex.printStackTrace();
        }
    }

    public static void beginTransaction() {
        Transaction tx = (Transaction) threadTransaction.get();
        try {
            if (tx == null) {
                tx = getSession().beginTransaction();
                threadTransaction.set(tx);
            }
        } catch (HibernateException ex) {
            ex.printStackTrace();
        }
    }

    public static void commitTransaction() {
        Transaction tx = (Transaction) threadTransaction.get();
        try {
            if (tx != null && !tx.wasCommitted()
                    && !tx.wasRolledBack())
                tx.commit();
            threadTransaction.set(null);
        } catch (HibernateException ex) {
            rollbackTransaction();
            ex.printStackTrace();
        }
    }

    public static void rollbackTransaction() {
        Transaction tx = (Transaction) threadTransaction.get();
        try {
            threadTransaction.set(null);
            if (tx != null && !tx.wasCommitted()
                    && !tx.wasRolledBack()) {
                tx.rollback();
            }
        } catch (HibernateException ex) {
            ex.printStackTrace();
        } finally {
            closeSession();
        }
    }

    public static void addClass(Class<?> className) {
        aconf.addAnnotatedClass(className);
    }

    public static void load() {
        Configuration conf = aconf.configure();
        factory = conf.buildSessionFactory();
    }

    public static void addPackage(String pack) {
        aconf.addPackage(pack);
    }
}


Чудесное свойство ThreadLocal!!!

Ну и встал вопрос как мне стартовать транзакцию и коммитировать или роллбечить?
У меня дума сделать фильтр:

Код

public class HibernateFilter implements javax.servlet.Filter {

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HibernateUtil.beginTransaction();
        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy() {
        HibernateUtil.commitTransaction();
        HibernateUtil.closeSession();
    }
}


Но, тут проблемка с роллбеком, где я должен его обрабатывать?

PM   Вверх
Greg
Дата 18.1.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.9.2006
Где: Беларусь, г.Минск

Репутация: 5
Всего: 7



Оборачивать каждый пользовательский запрос в транзакцию - неправильно. Даже если фильтр применяется не ко всем запросам - тоже неправильно. Создавать транзакцию нужно в классе, где реализуется работа с базой данных, там же фиксировать (commit) или откатывать (rollback). Настоятельно рекомендую читать про паттерн DAO  (Data Access Object) и смотреть примеры.

Это сообщение отредактировал(а) Greg - 18.1.2008, 17:10
--------------------
Страх перед возможностью ошибки не должен отвращать нас от поисков истины.
PM MAIL   Вверх
Platon
Дата 22.1.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 10
Всего: 40



...

Это сообщение отредактировал(а) Platon - 22.1.2008, 14:19
PM MAIL ICQ   Вверх
Greg
Дата 3.2.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.9.2006
Где: Беларусь, г.Минск

Репутация: 5
Всего: 7



Цитата(SuperFly @  21.11.2007,  18:37 Найти цитируемый пост)
Хотел узнать, как вы реализуете в JPA  или Hibernate по 1 сессии на запрос?
Есть стандартные решения или каждый делает своё?

Можно использовать реализацию паттерна Open Session In View из Spring framework - она инкапсулируется в фильтре org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.
Реализация паттерна привязывает объект org.hibernate.Session, к треду, в котором выполняется пользовательский запрос. Таким образом во время обработки пользовательского запроса разработчику не нужно заботиться о создании или освобождении сессии.

Это сообщение отредактировал(а) Greg - 3.2.2008, 15:13
--------------------
Страх перед возможностью ошибки не должен отвращать нас от поисков истины.
PM MAIL   Вверх
SuperFly
Дата 3.2.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



Как понять моё цитирование? Теперь сами столкнулись с такой проблемой? Но, вы же сами предложили некое решение.
PM   Вверх
Greg
Дата 3.2.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.9.2006
Где: Беларусь, г.Минск

Репутация: 5
Всего: 7



В предыдущем сообщении я говорил про транзакции, потому что из Вашего примера они создаются раньше чем требуется. А сейчас я собственно ответил на первый Ваш вопрос. Подробней про паттерн можно прочитать на http://www.hibernate.org

Это сообщение отредактировал(а) Greg - 3.2.2008, 15:14
--------------------
Страх перед возможностью ошибки не должен отвращать нас от поисков истины.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0939 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.