2010-12-28 3 views
6

내 응용 프로그램과 메모리에 큰 문제가 있습니다. 응용 프로그램 (java with jsf/richfaces/facelet)은 일부 7000 명의 사용자가 동시에 사용합니다.numberOfViewsInSession 및 여러 탭 문제

기본적으로 변수 com.sun.faces.numberOfViewsInSession은 web.xml에서 15로 설정됩니다. 이 변수는 뷰의 트리를 만들고 jsf는 15 번의 클릭으로 특정 뷰를 검색합니다.

예를 들어, 응용 프로그램에 3 개의 화면이 있으며 파이어 폭스를 사용합니다. 첫 번째 탭에서 세 번째 화면으로 이동합니다. 두 번째 탭에서는 첫 번째 화면이 있고 다음 단추를 클릭하면 jsf가 첫 번째 화면을 검색하고 두 번째 탭으로 이동합니다.

이 메커니즘은 훌륭하지만 많은 메모리 (세션 당 25Mo)를 소비하며이 숫자에 7000을 곱하면 175GB의 메모리가 필요합니다. 불가능합니다.

그래서 com.sun.faces.numberOfViewsInSession을 1 (세션 당 3Mo)로 설정하려고했습니다. 나는 다음 버튼을 두 번째 탭을 클릭하면

하지만 내 예와

, 나는 다음 오류 얻을 :

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) 

내 numberOfViewsInSession 그래서 1

때문에이 오류는, 논리적 내 질문 :

보기 (두 번째 탭)에있는 데이터를 알고있는 경우 예외를 잡아 내 사용자에 대한 새보기를 만들려면 어떻게해야합니까?

도움 주셔서 감사합니다.

답변

10

애플리케이션에 대한 특정 지식을 활용하여 수동으로보기를 복원하는 것은 어처구니없는 일일 수 있습니다.

해당 경로를 따르려면 JSF에서 StateManager API를 활용하고 예외를 잡아서는 안됩니다. 이를 통해 JSF 프레임 워크가 뷰 상태를 관리하는 방법을 사용자 정의 할 수 있습니다.

고급 주제입니다. 또는 에드 번스 '(JSF 스펙 리드) 단어 : 이미 JSF 2.0을 사용하지 않는 경우 말했다

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

, 그럼 내가보기 엔이로 업그레이드하는 것이 좋습니다. JSF 2.0의 새로운 특징은 부분적인 상태 저장입니다. 이렇게하면 상태를 저장하는 데 필요한 메모리 양이 크게 줄어 듭니다.

com.sun.faces.numberOfViewsInSession과 같은 매개 변수에 대한 지식이 클라이언트에서 상태를 사용하고 있다는 것을 이미 알고 있다고 생각할 수도 있습니다. 이것은 숨겨진 필드에 뷰 상태를 저장하고 기본적으로 클라이언트가 분산 메모리로 사용되기 때문에 무제한의 메모리를 제공합니다. 물론 이것은 증가 된 네트워크 오버 헤드를 초래합니다. AJAX의 경우이 오버 헤드가 너무 커서 고려할 수 없습니다.

+0

답변 해 주셔서 감사합니다. 많은 Ajax 요청이 있기 때문에 "클라이언트"저장 메서드를 사용할 수 있습니다. stateManager API에 대한 자습서가 있습니까? 나는 jsf 1.2를 사용하고 지금 버전을 업그레이드 할 수 없다. – Kiva

+0

Ed Burns의 전체 참조를 JavaServer Faces에 몇 가지 지침이 있지만, 그 내용을 자세히 언급하지는 않습니다. 그렇지 않으면 당신은 내가 당신에게 준 용어로 구글을 둘러 봐야한다. –