| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Почему тормозит Hibernate? |
| Автор: Andrey1 8.12.2008, 14:23 |
| Сотворил страничку, которая отображает данные одной таблицы из небольшой базы через Hibernate JPA. Проблема в том, что страница отображается слишком медленно :( . Насколько я понял, все тормоза случаются в момент: emf = Persistence.createEntityManagerFactory("myNameOfPU"); или em = emf.createEntityManager(); Hibernate разве не должен брать entityManager из пула...? Вопрос, почему таки тормоза и что делать? |
| Автор: MisterCleric 8.12.2008, 14:41 |
| Слушай, а ты лукап Factory делаешь при каждом вызове? Это же эквивалент SessionFactory в JPA. Его надо надо один раз создать а дальше из него брать EntityManager, как из SessionFactory Session |
| Автор: Andrey1 8.12.2008, 14:46 |
Я наивно полагал, что Hibernate JPA сам это делает... |
| Автор: MisterCleric 8.12.2008, 14:52 |
| Из пула берется EntityManager, а EntityManagerFactory - это класс конфигурации ну и провайдер всех JPA делов. Каждый раз когда ты его запрашивал, происходила переконфигурация твоего JPA-окружения |
| Автор: Andrey1 8.12.2008, 15:49 |
| Ага, то есть, если EntityManagerFactory запрашивать один раз в сессии или в application scope, то таких тормозов не будет и Hibernate не нужно никак дополнительно настраивать? |
| Автор: MisterCleric 8.12.2008, 16:04 |
| А что значит дополнительно настраивать? Лучше один раз при старте приложения все настроить, а дальше просто работать с базой через сущности |
| Автор: Andrey1 8.12.2008, 16:29 |
| Вообщем, ясно, что нужно Spring заюзать и хранить фабрику в application scope. |
| Автор: MisterCleric 8.12.2008, 16:37 | ||
| ну или как пишут в доке по JPA статический класс. А вообще не понятно, почему ты не пользуешься возможностями сервера приложений? Я беру EntityManage как:
в EJB3 SessionBeans и мне его инджектит контейнер. А сам PersistenceUnit подымает тоже контейнер - это твой EntityManagerFactory |
| Автор: Andrey1 8.12.2008, 16:56 |
Потому что Tomcat не умеет так делать |
| Автор: powerOn 8.12.2008, 20:32 | ||
А как вы тогда собираетесь транзакциями рулить? |
| Автор: MisterCleric 9.12.2008, 09:55 |
| У EntityManager есть два метода getTransaction(), как написано в JavaDoc, то его нужно вызывать не из JPA и есть метод flush(). по-моему достаточно дял руления транзакциями не в транзакционном контейнере. Ну а вообще, если все-таки TomCat. То надо посмотреть в сторону Spring. У них есть решения такого типа задач |
| Автор: Andrey1 9.12.2008, 12:26 | ||||
Решил через статическую фабрику и Listener:
Сейчас, правда, фабрика перегружается при любом, даже частичном, передеплое... |
| Автор: Andrey1 10.12.2008, 10:47 | ||
Да, возможно эта проблема когда-нибудь станет. И тогда я по-настоящему узнаю, зачем люди придумали Spring |