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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> управление сессиями в Hibernate, как правильно? 
:(
    Опции темы
XEugene
Дата 8.1.2008, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В доке по Hibernate нашел пример,  с которым решил поработать.
Прикрутил к нему несложную web-морду из jsp и сервлетов, начал тестировать и вскоре натолкнулся на это проблему... 


Итак,  при старте приложения у меня выводятся некие записи.

Код

    public List listAllBlogNames() throws HibernateException {
        Session session = HibernateUtil.currentSession();
        Transaction tx = null;
        List result = null;
        try {
           tx = session.beginTransaction();
           result = session.createCriteria(Blog.class).list();
           tx.commit();
        }
        catch (HibernateException he) {
            if (tx!=null) tx.rollback();
            throw he;
        }
        finally {
             session.close();
        }
        return result;
    }


Метод currentSession класса HibernateUtil
Код

    public static Session currentSession() throws HibernateException {
        Session s = (Session) session.get();
        // Open a new Session, if this Thread has none yet
        if (s == null) {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }


На этой же странице поместил форму для добавления новых блогов.

Добавляются они с помощью такого метода
Код

    public Blog createBlog(String name) throws HibernateException {

        Blog blog = new Blog();
        blog.setName(name);
        blog.setItems( new ArrayList() );
        Session session = HibernateUtil.currentSession();

        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.save(blog);
            tx.commit();
        }
        catch (HibernateException he) {
            if (tx!=null) tx.rollback();
            throw he;
        }
        finally {
            session.close();
        }
        return blog;
    }


Сразу же выяснилось, что если юзать показанные методы как есть,  то метод createBlog, вызванный после выполнения метода listAllBlogNames,  вызывает ошибку,  потому что в listAllBlogNames была закрыта сессия.

и это не смотря на то, что в createBlog она открывается снова в строке  session = HibernateUtil.currentSession();

Чтобы добавление заработало мне пришлось убрать session.close() в блоке finally.



Причем после добавления записи я делаю редирект на исходную страницу, где выводятся записи методом listAllBlogNames,
и там у меня из-за закрытия сессии в createBlog возникала такая же ошибка, пока я не убрал session.close() и из createBlog...



Таким образом у меня сейчас нигде не закрывается сессия и всё работает)


Но где-то же я должен закрывать сессию,  иначе у меня рано или поздно должен переполнится connection-пул Hibernate?


Вот собственно и вопрос,  как в этом маленьком простом примере правильно управлять сессиями?  Когда закрывать сессию? 
PM MAIL   Вверх
Kangaroo
Дата 8.1.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Вы берету сессию у HibernateUtil, а потом закрываете ее сами.. Это неправильно. HibernateUtil открыл, он должен и закрывать.
Попробуйте так:
Код

HibernateUtil.closeSession();


Ну, а если не заработает, тогда стектрейс ошибок в студию smile будем разбираться


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


Шустрый
*


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

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



Да,  я тоже об этом подумал.

Завтра посмотрю.  Я немного изменил оригинальный пример, в котором сразу столкнулся с это проблемой,  там не было HibernateUtil,  сессия открывалась из закрывалась напрямую.
PM MAIL   Вверх
XEugene
Дата 8.1.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



При закрытии через HibernateUtil естественно все нормально работает.   


Теперь более интересный вопрос...  Ведь используемый выше способ управления сессиями это пресловутый session-per-operation, а
Код

session-per-operation is an anti-pattern, one of the most expensive mistakes you can make in a Hibernate persistence layer design



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

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

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


 




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


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

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