2010-12-28 13 views
6

के साथ समस्या मेरे पास मेरे एप्लिकेशन और मेमोरी के साथ एक बड़ी समस्या है। आवेदन (jsf/richfaces/facelet के साथ जावा) का उपयोग कुछ 7000 उपयोगकर्ताओं द्वारा एक साथ किया जाता है।numberOfViewsInSession और एकाधिक टैब

डिफ़ॉल्ट रूप से, variable com.sun.faces.numberOfViewsInSession web.xml में 15 पर सेट है। यह चर दृश्यों का एक पेड़ बनाते हैं और जेएसएफ 15 क्लिक के दौरान एक विशिष्ट दृश्य पुनर्प्राप्त करते हैं।

उदाहरण के लिए, मैं एक आवेदन के लिए 3 स्क्रीन है और मैं फ़ायरफ़ॉक्स का उपयोग करें। मैं पहले टैब में तीसरी स्क्रीन में जाता हूं। दूसरे टैब में, मेरे पास पहली स्क्रीन है और मैं अगले बटन पर क्लिक करता हूं, जेएसएफ पहली स्क्रीन पुनर्प्राप्त करता है और दूसरे पर जाता है।

यह तंत्र बहुत अच्छा है लेकिन यह बहुत मेमोरी (25Mo मेरे लिए सत्र द्वारा) का उपभोग करता है और जब आप इस नंबर को 7000 से गुणा करते हैं, तो मुझे 175 मेमोरी की आवश्यकता होती है, यह असंभव है।

इसलिए मैंने 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

विशिष्ट ज्ञान आप अपने आवेदन के बारे में है का शोषण करके स्वयं भी दृश्य को रीस्टोर शायद बेहोश दिल के लिए एक कार्य नहीं है।

यदि आप उस पथ का पालन करना चाहते हैं, तो मुझे लगता है कि आपको अपवाद को पकड़ने का प्रयास नहीं करना चाहिए, लेकिन जेएसएफ में StateManager एपीआई का लाभ उठाने का प्रयास करना चाहिए। यह आपको जेएसएफ ढांचे के दृष्टिकोण को कैसे प्रबंधित करता है इस तरीके को अनुकूलित करने की अनुमति देता है।

ध्यान दें कि यह एक उन्नत विषय है। या फिर एड बर्न्स '(JSF कल्पना का अनुरोध) शब्दों में:

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

जिसके अनुसार, अगर आप पहले से JSF 2.0 का उपयोग नहीं कर रहे हैं, तो मैं अत्यधिक उन्नयन यह करने के लिए सलाह देते हैं। जेएसएफ 2.0 में एक बड़ी नई सुविधा आंशिक राज्य सेविंग है। यह नाटकीय रूप से राज्य को स्टोर करने के लिए आवश्यक स्मृति की मात्रा को कम करता है।

फिर भी एक और विकल्प, जो मुझे लगता है कि आपको पहले से ही यह माना जा सकता है कि आपको com.sun.faces.numberOfViewsInSession जैसे पैरामीटर का ज्ञान क्लाइंट पर राज्य का उपयोग कर रहा है। यह दृश्य स्थिति को छिपे हुए फ़ील्ड में संग्रहीत करता है, और मूल रूप से आपको असीमित स्मृति देता है क्योंकि क्लाइंट को वितरित स्मृति के रूप में उपयोग किया जाता है। बेशक यह बढ़ी हुई नेटवर्क ओवरहेड की महंगी कीमत पर आता है। AJAX के मामले में यह ओवरहेड इतना बड़ा हो सकता है कि यह विचार करना असंभव है।

+0

आपके उत्तर के लिए बहुत ही निर्देशक धन्यवाद। मैं "क्लाइंट" सेव विधि का उपयोग कर सकता हूं क्योंकि मेरे पास कई AJAX अनुरोध हैं। क्या आप राज्य प्रबंधक एपीआई के बारे में एक ट्यूटोरियल है? मैं जेएसएफ 1.2 का उपयोग करता हूं और अब मैं संस्करण को अपग्रेड नहीं कर सकता। – Kiva

+0

जावा बर्वर फेसेस में एड बर्न द्वारा पूरा संदर्भ में कुछ निर्देश दिए गए हैं, लेकिन मैं उन गहराई से कॉल नहीं करूंगा। अन्यथा आपको लगता है कि मैंने आपको जो शब्द दिया है, उस पर आपको बस Google के पास होना चाहिए। –

संबंधित मुद्दे