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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> виснет приложение после N запросов 
:(
    Опции темы
4epT
Дата 19.4.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброе утро! Столкнулся с проблемой ... почему то приложение виснет после выполнения N операций подряд. Приведу пример:

Есть страница с comboBox, в который грузятся страны:
Код

<p:selectOneMenu effect="drop" style="width: 200px;" value="#{countryController.selectedCountryString}">
                <f:selectItems value="#{countryController.allCountry}" />
</p:selectOneMenu>
<p:commandButton value="Удалить" action="#{countryController.deleteCountry}" update="message" ajax="false" style="width: 200px;" />


По нажатию на кнопку удаляется выбранная страна:
Код

public String deleteCountry(){

        WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(
                                        (ServletContext) FacesUtil.getExternalContext().getContext());
        countryDao = wac.getBean(CountryDao.class);
        
        if( selectedCountryString == null || countryDao == null){
            return "countryDelete";
        }
        
        Country country = countryDao.getCountryByName(selectedCountryString);
        
        if(country != null) {
            countryDao.delete(country);
            
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage("Страна " + country.getCountry() + " успешно удалена."));
            
            reloadCountry();
            
            return "countryDelete";
        }
        else {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage("Извините но произошла ошибка, попробуйте еще раз."));
            return "countryDelete";
        }
    }


Managedbean - countryController имеет область жизни Request.

CountryDao - это спринг бин, который прописан в applicationContext:
Код

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:/hibernate.cfg.xml" />
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
        <property name="hibernateProperties">
            <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            </props>
        </property>
    </bean>

<tx:annotation-driven transaction-manager="txManager" />

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="baseDaoImpl" class="olly.dao.BaseDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

<bean id="countryDaoImpl" class="olly.dao.CountryDaoImpl" parent="baseDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>



BaseDaoImpl - это дженерик dao.

И на последок, метод как я вытягиваю страну по имени:
Код

public Country getCountryByName(String name) {
        List<Country> lst = getSession().createCriteria(Country.class).add( Restrictions.eq("country", name) ).list();

        if( lst != null && lst.size() > 0 ){
            return lst.get(0);
        } else {
            return null;
        }
    }



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

Подскажите где я мог ошибиться ? или подскажите как хоть это отлаживать ? Через дебагер все объекты не null, то есть все вроде нормально. Виснет примерно после 4 - 5 транзакциях.

Заранее спасибо! 

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


Эксперт
****


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

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



А что в логе?

Памяти в системе достаточно для работы АПП сервера? 


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
4epT
Дата 19.4.2011, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vasay @ 19.4.2011,  12:50)
А что в логе?

Памяти в системе достаточно для работы АПП сервера?

В логах пусто, там видны только запросы к БД.

Вот насчет памяти не знаю. Но ведь глупо когда приложение ложится при попытки удалить 4 страны ? К слову в таблице country всего 10-15 стран.

Как можно увеличить объем доступной памяти ? может и вправду в этом дело.

Очисткой памяти ведь должен заниматься GC ... и countryController должен полностью выгружаться из памяти так как у него время жизни Request ...

Поправьте если не прав.

Это сообщение отредактировал(а) 4epT - 19.4.2011, 12:59
PM MAIL   Вверх
COVD
Дата 19.4.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

запросы к БД

закрываете?
PM MAIL   Вверх
4epT
Дата 19.4.2011, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(COVD @ 19.4.2011,  13:14)
Цитата

запросы к БД

закрываете?

В hibernate конфиге указано:
Код

<property name="hibernate.transaction.flush_before_completion">true</property>
    <property name="hibernate.transaction.auto_close_session">true</property>


или я не про то закрытие понял ?

p.s. метод удаления из BaseDaoImpl:
Код

@Transactional(readOnly = false)
    public void delete(T entity) {
        getSession().delete(entity);
        getSession().flush();
    }



Это сообщение отредактировал(а) 4epT - 19.4.2011, 14:00
PM MAIL   Вверх
MisterCleric
Дата 19.4.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Hibernate тут не причем. Запускай профайлер и смотри, кто у тебя кушает память


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


Опытный
**


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

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



Цитата(MisterCleric @ 19.4.2011,  14:01)
Hibernate тут не причем. Запускай профайлер и смотри, кто у тебя кушает память

Слышал что в нетбинсе встроен профайлер ... где его там можно найти ?
PM MAIL   Вверх
Vasay
Дата 19.4.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



4epT
Цитата

В логах пусто, там видны только запросы к БД.


А в логе APP сервера? Если с памятью проблема - должен на это выругаться.



Цитата

Как можно увеличить объем доступной памяти ? может и вправду в этом дело.


в настройках апп сервера. Где-нибудь должны стоять ключи: Xmx/Xms .  




--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
4epT
Дата 19.4.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А в логе APP сервера? Если с памятью проблема - должен на это выругаться.


под логами я имею ввиду вкладка netbeans - Apache Tomcat Logs (или как то так ...).

Цитата

в настройках апп сервера. Где-нибудь должны стоять ключи: Xmx/Xms .  


можно пример для томкета ?) где эти параметры прописать =) 
PM MAIL   Вверх
Vasay
Дата 19.4.2011, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если под виндой - смотрите Catalina.bat, на предмет "set JAVA_OPTS = Xmx****m"

Но я не уверен, что если Вы запускаете томкэт из нетбинса, то он не обходит Catalina.bat, запуская его со своими опциями.

П.с. я не знаю насколько хорошо NetBeans дружит с TomCat, но если Вы запускаете приложение из NetBeans - попробуйте запустить его на GlassFish - там очень хорошо все отображается в IDE вплане ошибок. Будет сразу видно в чем проблема - памяти не хватает, или эксепшен в вашей программе какой...  (хотя в логах томкэта это все тоже должно быть...)


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
4epT
Дата 19.4.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vasay @ 19.4.2011,  15:10)
Если под виндой - смотрите Catalina.bat, на предмет "set JAVA_OPTS = Xmx****m"

Но я не уверен, что если Вы запускаете томкэт из нетбинса, то он не обходит Catalina.bat, запуская его со своими опциями.

П.с. я не знаю насколько хорошо NetBeans дружит с TomCat, но если Вы запускаете приложение из NetBeans - попробуйте запустить его на GlassFish - там очень хорошо все отображается в IDE вплане ошибок. Будет сразу видно в чем проблема - памяти не хватает, или эксепшен в вашей программе какой...  (хотя в логах томкэта это все тоже должно быть...)

Как буду дома попробую ... ) всем спасибо за помощь!

Как что то будет известно отпишусь )
PM MAIL   Вверх
4epT
Дата 19.4.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попробовал поднять приложение на GlassFish. При старте сервера ошибок не было кроме WARNING:
Код


INFO: schema update complete
INFO: Using DataSource [org.apache.commons.dbcp.BasicDataSource@58824bce] of Hibernate SessionFactory for HibernateTransactionManager

WARNING: Unable to proxy method [public final org.hibernate.SessionFactory org.springframework.orm.hibernate3.support.HibernateDaoSupport.getSessionFactory()] because it is final: All calls to this method via a proxy will be routed directly to the proxy.

WARNING: Unable to proxy method [public final void org.springframework.orm.hibernate3.support.HibernateDaoSupport.setSessionFactory(org.hibernate.SessionFactory)] because it is final: All calls to this method via a proxy will be routed directly to the proxy.



К слову выше указанные ворнинги, не единственные. их там порядка 10-15, между собой похожи ...

Может я не правильно настроил dataSource ? в спринг контексте ...

Ну и вот такой эксепшен:
Код

INFO: olly was successfully deployed in 17 847 milliseconds.
SEVERE: java.io.IOException: Error creating temporary file transfer folder
    at org.glassfish.admin.payload.PayloadFilesManager.createTempFolder(PayloadFilesManager.java:718)


Profile запустить не получилось, вылетает ошибка и все ... (

сори, за такое форматирование ... не пойму почему так получается.


Это сообщение отредактировал(а) 4epT - 19.4.2011, 20:04
PM MAIL   Вверх
Vasay
Дата 19.4.2011, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



4epT, 

А заработало несмотря на эксепшен или нет?

Пс - система какая? Где установлен GlassFish (в какой папке)? Не баг ли это из-за того, что ему не дают создать файлы в програмс файл?


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
4epT
Дата 19.4.2011, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vasay @ 19.4.2011,  20:32)
4epT, 

А заработало несмотря на эксепшен или нет?

Пс - система какая? Где установлен GlassFish (в какой папке)? Не баг ли это из-за того, что ему не дают создать файлы в програмс файл?

Под GlassFish заработало, но не полностью ... из базы country вытянул, но не удаляет ...

Система Windows 7=) GlassFish установлен в C:\Program files\glassfish 

И все таки хотелось бы на томкете подымать приложение .. )

Это сообщение отредактировал(а) 4epT - 19.4.2011, 23:18
PM MAIL   Вверх
Vasay
Дата 20.4.2011, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Под GlassFish заработало, но не полностью ... из базы country вытянул, но не удаляет ...


При попытки удаления должен тогда сыпать эксепшенами....

Цитата

Система Windows 7=) GlassFish установлен в C:\Program files\glassfish 


Наверно, с этим и связана ругань насчет невозможности создания папки.


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
4epT
Дата 20.4.2011, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В логах томкета увидел вот такое:
Код

WARNING: Could not find configuration [org.hibernate.cache.StandardQueryCache]; using defaults.
Hibernate: 
    /* delete olly.entity.Country */ delete 
        from
            st.countries 
        where
            id=?
20.04.2011 9:19:56 org.hibernate.connection.DriverManagerConnectionProvider close
INFO: cleaning up connection pool: null
20.04.2011 9:19:56 com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback visit
SEVERE: javax.el.ELException: /admin/countryDelete.xhtml @16,82 value="#{countryController.allCountry}": Error reading 'allCountry' on type olly.managers.CountryManager
20.04.2011 9:20:02 org.hibernate.connection.DriverManagerConnectionProvider close
INFO: cleaning up connection pool: null


такое написало после удаления второй страны, потом метод jsf бина getAllCountry уже не смог прочитать страны:
Код

Error reading 'allCountry' on type olly.managers.CountryManager


Это не похоже на ошибку ?)

PM MAIL   Вверх
4epT
Дата 20.4.2011, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Выяснил что приложение ложиться из за:
Код

java.lang.OutOfMemoryError: PermGen space


Смотрел через профайлер, когда доставал список стран было видно что очень сильно скакнула память ... памяти выделил 512 метров, каким образом так быстро память улетает ? Что с этим делать?
PM MAIL   Вверх
dobrolub
Дата 20.4.2011, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



permGen используется для кэширования классов (в числе прочего) и в если ошибки будут продолжатся и далее, то нужно посмотреть где текут класслоадеры (java.lang.Classloader и его наследники)

для этого есть утилитка jmap, запускай её с ключом -permstat и смотри на результат. На винде она не работает с этим ключом к сож.

jmap -permstat <pid>

Добавлено через 5 минут и 23 секунды
для винды, чтото вроде http://www.yourkit.com/docs/kb/class_loaders.jsp о
PM   Вверх
4epT
Дата 20.4.2011, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Установил YourKit, попытался разобраться .... но очень много показателей и просто напросто запутался. Можете подсказать куда конкретно посмотреть ? Или может быть просто увеличить permsize ? 

нашел во вкладке Class List:
Код

Name                                   Number of Objects
olly.entity.country                             30
...
olly.managers.CountryManager         1
olly.dao.CountryDaoImpl                    1


есть еще один класс, объектов которого 51 ... но он не мой, он находится в пакете com.sun.org...

ну и есть 118 799 - java.lang.String  и примерно столько же char[]

p.s. Как часто вообще сталкиваются с такими проблемами ? Не у одного знакомого такого не было...

Это сообщение отредактировал(а) 4epT - 20.4.2011, 22:42
PM MAIL   Вверх
dobrolub
Дата 20.4.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



в моей практике было пару раз. Причиной может быть количество классов в аппликухе (включая библиотеки, конечно) требующее больший permgen чем выделяется по умолчанию, или, "ClassLoader leak" - когда классы загружаюся в новый класслоадер снова и снова, и ссылка на класслоадер остаётся. 

первое просто требует увеличения permgen, второе -баг в аппликухе и его надо найти и исправить.

Добавлено через 2 минуты и 23 секунды
Если после увеличения до 512м у тебя ошибки прекратяться, то всё в порядке. Если будут продолжать лезть - найди наиболее повторяющийся класслоадер (г. типа org.spring org.hibernate ) и следи, не растёт ли их число .
PM   Вверх
4epT
Дата 20.4.2011, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не подскажешь как правильно увеличить permgen ?  )

я через IDE (netbeans) полез в настройки сервера и прописал там параметр: -XX:MaxPermSize=512m
PM MAIL   Вверх
dobrolub
Дата 20.4.2011, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



catalina.bat декларирует несколько параметеров; твой - JAVA_OPTS

нужно установить присвоить переменной окружения ( Environmеnt Variable ) значиение  -XX:MaxPermSize=512m 

если запускаешь из коммандной строки сделай 

set JAVA_OPTS=-XX:MaxPermSize=512M
catalina.bat start


или установи её глобально, такоже как устанавливают JAVA_HOME, ANT_HOME, ORACLE_HOME и т.д.

Ну и конечно убедись что она действительно встала с помощью jvisualvm или jconsole
PM   Вверх
4epT
Дата 21.4.2011, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dobrolub, увеличение permgen результата не дало ( какие самые распространенные баги в "аппликухе" ? Как выяснить где я напорол ? 
PM MAIL   Вверх
dobrolub
Дата 21.4.2011, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



Ну вот перезагрузка веб-аппликухи такой эффект может дать. В томкат 7 есть даже такая фишка - протекция против permgen leak. http://wiki.apache.org/tomcat/MemoryLeakProtection

Я думаю первый шаг - убедиться что ты на томкат 7, а потом анализировать дерево классов, смотреть что держит лоадеры которые растут в  числе. Ешё погугли на предмет permgen и библиотек которые в твоей аппликухе крутятся.
PM   Вверх
4epT
Дата 21.4.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



скажите пожалуйста, а может ли быть проблема в неправильной конфигурации Spring / Hibernate ?

P.s. просто в плане архитектуры у меня сомнения в том что я  где то напорол ... так как весь дао списан с работы.  Единственное что сам писал так это файлы конфига + вместо Struts подключил JSF ...

Это сообщение отредактировал(а) 4epT - 21.4.2011, 17:24
PM MAIL   Вверх
4epT
Дата 21.4.2011, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Выяснил что метод getAllCountry за один сабмит вызывается три раза Оо.

вот код страницы:
Код

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <p:growl autoUpdate="true" id="message" life="5" sticky="true"/>
            <p:panel header="Страны. Удаление." id="panel">
                <h:panelGrid columns="2">
                    <p:selectOneMenu effect="drop" style="width: 200px;" 
value="#{countryController.selectedCountryString}">
                        <f:selectItems value="#{countryController.allCountry}" />
                    </p:selectOneMenu>
                    <p:commandButton value="Удалить" actionListener="#{countryController.deleteCountry}"
 update="message,panel" style="width: 200px;" />
                </h:panelGrid>
            </p:panel>
        </h:form>
    </h:body>
</html>



А вот managed jsf bean:
Код

package olly.managers;

import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import olly.dao.CountryDao;
import olly.entity.Country;
import olly.util.FacesUtil;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

@ManagedBean(name="countryController")
@ViewScoped
public class CountryManager implements Serializable{
    
    private CountryDao countryDao;
    private String selectedCountryString;
    private String countryName;
    
    public CountryManager(){
        
        WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(
                                        (ServletContext) FacesUtil.getExternalContext().getContext());
        countryDao = wac.getBean(CountryDao.class);
        
    }

    public SelectItem[] getAllCountry(){

        List<Country> lst = countryDao.list();
        SelectItem[] lstCountry = new SelectItem[lst.size()];
        
        for(int i = 0; i < lst.size(); i++){
            lstCountry[i] = new SelectItem(lst.get(i), lst.get(i).getCountry());
        }
        
        return lstCountry;
    }

    public void deleteCountry(){
        
        if( selectedCountryString == null || countryDao == null){
            return;
        }
        
        Country country = countryDao.getCountryByName(selectedCountryString);
        
        if(country != null) {
            countryDao.delete(country);
            
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage("Страна " + country.getCountry()
 + " успешно удалена."));
            
            //return "countryDelete";
        }
        else {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage("Извините но произошла
 ошибка, попробуйте еще раз."));
            //return "countryDelete";
        }
    }

    public String getSelectedCountryString() {
        return selectedCountryString;
    }

    public void setSelectedCountryString(String selectedCountryString) {
        this.selectedCountryString = selectedCountryString;
    }

    public String getCountryName() {
        return countryName;
    }

    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }
}


Как видно, я по "сабмиту" вызываю метод getAllCountry и потом перерисовываю панель. Каким образом метод вызывается 3 раза ?

2 раза вызывается - при нажатии на кнопку и один раз после удаления.
 

Это сообщение отредактировал(а) 4epT - 21.4.2011, 23:25
PM MAIL   Вверх
kaa
Дата 26.4.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



4epT, сам сейчас только вникаю в тонкости JSF, но в общем троекратный вызов метода связан с жизненным циклом запроса.

Как только твой запрос пришёл на сервер, JSF пытается восстановить дерево страницы и провалидировать значения. После обработки он обновляет дерево страницы - и тоже запрашивает данные со всех бинов - глянь на код своей страницы. 

У тебя там есть запись 

Код

{#countryController.allCountry}


Соответственно, при восстановлении дерева страницы, JSF должен знать какая инфа может содержаться в данном компоненте и перед рендерингом, при обновлении дерева ему нужно получить актуальную инфу для селекта + в процессе валидации скорее всего дёргает проперти данного бина (не спрашивай почему, для меня пока это тоже тёмный лес).

В общем кол-во вызовов функций, представляющих проперти бина, зависит от процесса обработки и компонента и может сильно разниться smile Проверено лично на примере RichFaces-овской модели таблицы - вот там перевызовы так перевызовы smile

Вообще работая с БД в JSF без кеша лучше не жить - жрёт память как бегемот и тупит как ленивец.

Добавлено @ 11:09
Попробуй в самом деле с хиберовскими кешами поиграться - может поможет?

Добавлено @ 11:11
Особое внимание удели кешу второго уровня. Он там по умолчанию отключен.

Это сообщение отредактировал(а) kaa - 26.4.2011, 11:11
PM MAIL   Вверх
4epT
Дата 26.4.2011, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо за ответ =) Я включил в настройках хибера использовать кеш второго уровня - это достаточно ? или лучше использовать специальные либы для кеша ?

Ну и на сколько я понял трехкратный вызов метода никак не исправить ?)

P.s. зависание больше не происходит ... исправил в baseDaoImpl метод - list. Сделал его @Transactional. 
PM MAIL   Вверх
kaa
Дата 27.4.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет!

По поводу кэша: что-то я не слышал про сторонние либы для кеширования кишков хибера. Да и странно это было бы. Хибер-то лучше знает что ему надо - это он рулит ентити-объектами.

Про вызов: нет, это ядро JSF само дёргает, для своих нужд.


Уточнить просто хочется: после добавления @Transactional виснуть перестало?
PM MAIL   Вверх
4epT
Дата 28.4.2011, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да после добавления @Transactional виснуть перестало. И помойму я даже понял почему ... дело в том что висло при запросе select ... и видимо хибер делал не простой select а что то вроде select for update. И из за частого выполнения этого запроса ( из за JSF ) делался дед лок на базу и и за этого все висло.
PM MAIL   Вверх
kaa
Дата 28.4.2011, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хитро блин smile
Спасибо, запомню на будущее smile
PM MAIL   Вверх
4epT
Дата 28.4.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не за что =)
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.2029 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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