2010-12-28 13 views
6

Mam duży problem z moją aplikacją i pamięcią. Aplikacja (java z jsf/richfaces/facelet) jest używana przez około 7000 użytkowników jednocześnie.Problem z numberOfViewsInSession i wieloma zakładkami

Domyślnie zmienna com.sun.faces.numberOfViewsInSession jest ustawiona na 15 w pliku web.xml. Ta zmienna tworzy drzewo widoków, a jsf pobiera określony widok podczas 15 kliknięć wstecz.

Na przykład mam 3 ekrany dla aplikacji i używam firefox. Idę na trzecim ekranie w pierwszej zakładce. W drugiej zakładce mam pierwszy ekran i klikam na następny przycisk, jsf pobiera pierwszy ekran i przechodzi do drugiego.

Ten mechanizm jest świetny, ale zużywa dużo pamięci (dla mnie to 25 milionów razy), a gdy pomnożymy tę liczbę przez 7000, potrzebuję pamięci 175 Go, to niemożliwe.

Tak więc próbowałem ustawić com.sun.faces.numberOfViewsInSession równe 1 (3Mo po sesji).

Ale z moim przykładzie, po kliknięciu w drugiej zakładce następnego przycisku pojawia się kolejny błąd:

javax.servlet.ServletException: viewId:/private/pages/data/dataView.faces - View /private/pages/data/dataView.faces could not be restored. 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:270) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) 
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at fr.generali.mezzo.front.commun.performance.filters.PerformanceFilter.doFilter(PerformanceFilter.java:72) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173) 
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) 
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) 
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) 
at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:420) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
at java.lang.Thread.run(Thread.java:595) 

Ten błąd jest logiczne, ponieważ mój numberOfViewsInSession to 1.

Więc moje Pytanie brzmi:

Biorąc pod uwagę, że znam dane w widoku (dla drugiej karty), jak mogę zrobić, aby uchwycić wyjątek i utworzyć nowy widok dla mojego użytkownika?

Dzięki za pomoc.

Odpowiedz

10

Przywracanie widoku ręcznie dzięki wykorzystaniu wiedzy na temat aplikacji może nie być zadaniem dla osób o słabych nerwach.

Jeśli chcesz podążać tą ścieżką, myślę, że nie powinieneś próbować wychwycić wyjątku, ale skorzystać z interfejsu API StateManager w JSF. Pozwala to dostosować sposób, w jaki struktura JSF zarządza swoim stanem widoku.

Należy zauważyć, że jest to zaawansowany temat. Lub w Ed Burns' (JSF Spec ołów) słowami:

View state management is a complex business, and few application developers will have to worry about customizing it.

Powiedział, że jeśli nie jesteś już przy użyciu JSF 2.0, to bardzo polecam aktualizację do tego. Dużą nowością w JSF 2.0 jest Częściowe zapisanie stanu. Znacząco zmniejsza to ilość pamięci potrzebnej do przechowywania stanu.

Jeszcze inna opcja, która prawdopodobnie już brała pod uwagę, że masz znajomość parametrów takich jak com.sun.faces.numberOfViewsInSession używa stanu na kliencie. To przechowuje stan widoku w ukrytych polach i zasadniczo daje ci nieograniczoną pamięć, ponieważ klient jest używany jako pamięć rozproszona. Oczywiście wiąże się to z kosztami zwiększonego obciążenia sieci. W przypadku AJAX ten narzut może być tak duży, że nie można go wziąć pod uwagę.

+0

Dzięki za odpowiedź bardzo pouczające. Mogę użyć metody "klienta", ponieważ mam wiele żądań ajaxowych. Czy masz samouczek dotyczący api StateManager? Używam jsf 1.2 i nie mogę teraz uaktualnić wersji. – Kiva

+0

W JavaServer jest kilka instrukcji Staje się pełnym odnośnikiem Eda Burnsa, ale nie nazwałbym ich dogłębnie. W przeciwnym razie po prostu musisz mieć Google w pobliżu, podałem termin, który ci podałem. –

Powiązane problemy