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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему тормозит Hibernate? 
:(
    Опции темы
Andrey1
Дата 8.12.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сотворил страничку, которая отображает данные одной таблицы из небольшой базы через Hibernate JPA.
Проблема в том, что страница отображается слишком медленно :( . 

Насколько я понял, все тормоза случаются в момент:

        emf = Persistence.createEntityManagerFactory("myNameOfPU");
или 
        em = emf.createEntityManager();

Hibernate разве не должен брать entityManager из пула...?

Вопрос, почему таки тормоза и что делать?

Это сообщение отредактировал(а) Andrey1 - 8.12.2008, 14:45


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
MisterCleric
Дата 8.12.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Слушай, а ты лукап Factory делаешь при каждом вызове?
Это же эквивалент SessionFactory в JPA. Его надо надо один раз создать а дальше из него брать EntityManager, как из SessionFactory Session


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Andrey1
Дата 8.12.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MisterCleric @  8.12.2008,  14:41 Найти цитируемый пост)
Слушай, а ты лукап Factory делаешь при каждом вызове?

Я наивно полагал, что Hibernate JPA сам это делает...


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
MisterCleric
Дата 8.12.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Из пула берется EntityManager, а EntityManagerFactory - это класс конфигурации ну и провайдер всех JPA делов.
Каждый раз когда ты его запрашивал, происходила переконфигурация твоего JPA-окружения


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Andrey1
Дата 8.12.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ага, то есть, если EntityManagerFactory запрашивать один раз  в сессии или в application scope, то таких тормозов не будет и Hibernate не нужно никак дополнительно настраивать?

Это сообщение отредактировал(а) Andrey1 - 8.12.2008, 15:50


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
MisterCleric
Дата 8.12.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



А что значит дополнительно настраивать?
Лучше один раз при старте приложения все настроить, а дальше просто работать с базой через сущности


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Andrey1
Дата 8.12.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообщем, ясно, что нужно Spring заюзать и хранить фабрику в application scope.


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
MisterCleric
Дата 8.12.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



ну или как пишут в доке по JPA статический класс.
А вообще не понятно, почему ты не пользуешься возможностями сервера приложений?

Я беру EntityManage

как:

Код

  @PersistenceContext
    protected EntityManager em;


в EJB3 SessionBeans и мне его инджектит контейнер. А сам PersistenceUnit подымает тоже контейнер - это твой EntityManagerFactory


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Andrey1
Дата 8.12.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MisterCleric @  8.12.2008,  16:37 Найти цитируемый пост)
Я беру EntityManage как:
  @PersistenceContext


Потому что Tomcat не умеет так делать smile. А Glassfish тормозит.


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
powerOn
Дата 8.12.2008, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(Andrey1 @  8.12.2008,  16:56 Найти цитируемый пост)
Потому что Tomcat не умеет так делать smile. А Glassfish тормозит. 


А как вы тогда собираетесь транзакциями рулить?


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
MisterCleric
Дата 9.12.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



У EntityManager есть два метода 

getTransaction(), как написано в JavaDoc, то его нужно вызывать не из JPA

и есть метод flush().

по-моему достаточно дял руления транзакциями не в транзакционном контейнере.

Ну а вообще, если все-таки TomCat. То надо посмотреть в сторону Spring. У них есть решения такого типа задач


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Andrey1
Дата 9.12.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Решил через статическую фабрику и Listener:

Код

public class GenericEntityManagerFactory {

    private static EntityManagerFactory emf = null;

    public GenericEntityManagerFactory()
    {
    }

    /**
     * @return the emf
     */
    public static EntityManagerFactory getEmf()
    {
        return emf;
    }

    /**
     * @param aEmf the emf to set
     */
    public static void setEmf(EntityManagerFactory aEmf)
    {
        emf = aEmf;
    }

...

public class HibernateListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {
        GenericEntityManagerFactory.setEmf(Persistence.createEntityManagerFactory(CONSTANTS.namePU));
        // Just call the static initializer of that class
    }

    public void contextDestroyed(ServletContextEvent event) {
        GenericEntityManagerFactory.getEmf().close();
    }
}

...


Код

<!--- in web.xml -->

    <listener>
        <listener-class>jpa.util.HibernateListener</listener-class>
    </listener>
...



Сейчас, правда, фабрика перегружается при любом, даже частичном, передеплое...

Это сообщение отредактировал(а) Andrey1 - 9.12.2008, 12:29


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
powerOn
Дата 9.12.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(MisterCleric @  9.12.2008,  09:55 Найти цитируемый пост)
У EntityManager есть два метода 

getTransaction(), как написано в JavaDoc, то его нужно вызывать не из JPA

и есть метод flush().

по-моему достаточно дял руления транзакциями не в транзакционном контейнере.


это понятно, что можно писать компоненты которые будут управлять транзакциями в ручную, да вот только такой подход (как аукнится так и) откликнется при написании тестов. Да и код становится прозрачнее если содержит только бизнес логику. К тому же, если что-то за тебя уже написано не надо тратить время на изобретение велосипеда. Поэтому я думаю, что транзакциями нужно рулить декларативно. 

Но если с томката никуда не уйти, то лучше уж использовать spring и не извращаться.



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Andrey1
Дата 10.12.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(powerOn @  9.12.2008,  13:44 Найти цитируемый пост)
Поэтому я думаю, что транзакциями нужно рулить декларативно. 

Но если с томката никуда не уйти, то лучше уж использовать spring и не извращаться.


Да, возможно эта проблема когда-нибудь станет. 
И тогда я по-настоящему узнаю, зачем люди придумали Spring smile.


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1051 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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