JSF सर्वर पर UI घटकों की स्थिति को क्यों बचाता है?


108
  1. जेएसएफ किस समय तक यूआई घटकों की स्थिति को सर्वर साइड पर सहेजता है और जब तक यूआई घटक की स्थिति की जानकारी सर्वर मेमोरी से हटा दी जाती है? एप्लिकेशन पर एक लॉग-इन उपयोगकर्ता के रूप में हालांकि पृष्ठों पर नेविगेट करता है, क्या घटक की स्थिति सर्वर पर जमा होती रहेगी?

  2. मुझे समझ नहीं आ रहा है कि यूआई कंपोनेंट्स को सर्वर पर रखने का क्या फायदा है? सीधे प्रबंधित / परिवर्तित डेटा को प्रबंधित सेम में पर्याप्त रूप से पारित नहीं किया जा रहा है? क्या मुझे इससे बचने की कोशिश करनी चाहिए या नहीं?

  3. यदि सर्वर के हजारों समवर्ती उपयोगकर्ता सत्र हैं, तो क्या यह बहुत अधिक मेमोरी का उपभोग नहीं करता है ? मेरे पास एक एप्लिकेशन है जहां उपयोगकर्ता कुछ विषयों पर ब्लॉग पोस्ट कर सकते हैं। यह ब्लॉग आकार में काफी बड़ा है। जब ब्लॉगों को देखने के लिए पोस्ट बैक या अनुरोध किया जाएगा , तो क्या यह बड़ा पेज डेटा घटकों की स्थिति के हिस्से के रूप में सहेजा जाएगा? यह बहुत अधिक स्मृति खा जाएगा। क्या यह चिंता का विषय नहीं है?


अपडेट 1:

अब, JSF का उपयोग करते समय राज्य को बचाना आवश्यक नहीं है। एक उच्च प्रदर्शन स्टेटलेस जेएसएफ कार्यान्वयन उपयोग के लिए उपलब्ध है। प्रासंगिक विवरण और चर्चा के लिए इस ब्लॉग और इस प्रश्न को देखें। इसके अलावा, JSF चश्मा में शामिल करने के लिए एक खुला मुद्दा है, JSF के लिए स्टेटलेस मोड प्रदान करने का विकल्प। (पी एस मुद्दों के लिए मतदान पर विचार करें इस और इस करता है, तो यह आपके लिए एक उपयोगी सुविधा है।)


अपडेट 2 (24-02-2013):

Mojra 2.1.19 स्टेटलेस मोड के साथ बाहर है कि एक बड़ी खबर !

यहाँ देखें:

http://weblogs.java.net/blog/mriem/archive/2013/02/08/jsf-going-stateless?force=255

http://java.net/jira/browse/JAVASERVERFACES-2731

http://balusc.blogspot.de/2013/02/stateless-jsf.html

जवाबों:


199

जेएसएफ को सर्वर की तरफ यूआई घटकों की स्थिति को बचाने की आवश्यकता क्यों है?

क्योंकि HTTP स्टेटलेस है और JSF स्टेटफुल है। जेएसएफ घटक वृक्ष गतिशील (प्रोग्रामेटिक) परिवर्तनों के अधीन है। जेएसएफ को बस सटीक स्थिति को जानने की जरूरत है क्योंकि यह तब था जब फॉर्म एंड्यूसर को प्रदर्शित किया गया था, ताकि यह मूल जेएसएफ घटक पेड़ द्वारा प्रदान की गई जानकारी के आधार पर पूरे जेएसएफ जीवनचक्र को सफलतापूर्वक संसाधित कर सके जब फॉर्म वापस सबमिट किया गया हो। सर्वर। घटक ट्री अनुरोध पैरामीटर नाम, आवश्यक कन्वर्टर्स / सत्यापनकर्ता, बाउंड प्रबंधित गुण और क्रिया विधियों के बारे में जानकारी प्रदान करता है।


जेएसएफ किस समय तक यूआई कंपोनेंट्स की स्थिति को सर्वर साइड में सेव करता है और यूआई कंपोनेंट की स्टेट इनफार्मेशन को सर्वर मेमोरी से कब हटाया जाता है?

उन दो सवालों को एक ही उबाल लगता है। वैसे भी, यह विशिष्ट कार्यान्वयन है और यह भी निर्भर करता है कि राज्य सर्वर या क्लाइंट पर सहेजा गया है या नहीं। थोड़ा सा अच्छा कार्यान्वयन इसे हटा देगा जब यह समाप्त हो गया है या जब कतार भरी हुई है। उदाहरण के लिए मोझरा में 15 तार्किक विचारों की डिफ़ॉल्ट सीमा होती है जब राज्य की बचत सत्र के लिए निर्धारित की जाती है। यह निम्नलिखित संदर्भ में निम्नलिखित के साथ विन्यास योग्य है web.xml:

<context-param>
    <param-name>com.sun.faces.numberOfLogicalViews</param-name>
    <param-value>15</param-value>
</context-param>

अन्य मोआज़रा-विशिष्ट पार्म्स और इससे संबंधित उत्तर com.sun.faces.numberOfViewsInSession बनाम com.sun.faces.numberOfLogicalViews के लिए Mojarra FAQ भी देखें


एप्लिकेशन पर एक लॉग-इन उपयोगकर्ता के रूप में हालांकि पृष्ठों पर नेविगेट करता है, क्या घटक की स्थिति सर्वर पर जमा होती रहेगी?

तकनीकी रूप से, यह कार्यान्वयन पर निर्भर करता है। यदि आप पेज-टू-पेज नेविगेशन (सिर्फ GET अनुरोध) के बारे में बात कर रहे हैं, तो Mojarra सत्र में कुछ भी नहीं बचाएगा। यदि वे हालांकि POST अनुरोध (कमांडोलिंक / बटन के साथ फॉर्म) हैं, तो मोअज़रा सत्र में प्रत्येक फॉर्म की अधिकतम सीमा तक स्थिति को बचाएगा। यह एंड्यूसर को एक ही सत्र में विभिन्न ब्राउज़र टैब में कई रूपों को खोलने में सक्षम बनाता है।

या, जब राज्य की बचत ग्राहक के लिए निर्धारित की जाती है, तो JSF सत्र में कुछ भी संग्रहीत नहीं करेगा। आप निम्न संदर्भ में निम्नलिखित कर सकते हैं web.xml:

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

फिर इसे javax.faces.ViewStateप्रपत्र के नाम के साथ एक छिपे हुए इनपुट फ़ील्ड में एक एन्क्रिप्टेड स्ट्रिंग पर क्रमांकित किया जाएगा ।


मुझे समझ में नहीं आता है कि यूआई घटक की स्थिति को सर्वर साइड पर रखने का क्या लाभ है। सीधे प्रबंधित / परिवर्तित डेटा को प्रबंधित सेम में पर्याप्त रूप से पारित नहीं किया जा रहा है? क्या मुझे इससे बचने की कोशिश करनी चाहिए?

जेएसएफ की अखंडता और मजबूती सुनिश्चित करने के लिए यह पर्याप्त नहीं है। जेएसएफ एक गतिशील ढांचा है जिसमें नियंत्रण का एकल प्रवेश बिंदु है। राज्य प्रबंधन के बिना, एक निश्चित तरीके (जैसे जोड़ तोड़ disabled, readonlyऔर renderedविशेषताएँ) में HTTP अनुरोधों को बिगाड़ने / हैक करने में सक्षम होगा , JSF को अलग-अलग संभावित खतरनाक चीजों को करने के लिए। यहां तक ​​कि सीएसआरएफ के हमलों और फिशिंग का भी खतरा होगा।


और अगर हजारों समवर्ती उपयोगकर्ता सत्र होते हैं, तो यह सर्वर की तरफ बहुत अधिक मेमोरी का उपभोग नहीं करेगा? मेरे पास एक एप्लिकेशन है जहां उपयोगकर्ता कुछ विषयों पर ब्लॉग पोस्ट कर सकते हैं। यह ब्लॉग आकार में काफी बड़ा है। जब ब्लॉगों को देखने के लिए पोस्ट बैक या अनुरोध किया जाएगा, तो बड़े ब्लॉग घटकों की स्थिति के हिस्से के रूप में सहेजे जाएंगे। यह बहुत अधिक स्मृति का उपभोग करेगा। क्या यह चिंता का विषय नहीं है?

स्मृति विशेष रूप से सस्ती है। बस आब्जर्वर को पर्याप्त मेमोरी दें। या यदि नेटवर्क बैंडविड्थ आपके लिए सस्ता है, तो बस ग्राहक की ओर जाने वाली बचत को स्विच करें। सबसे अच्छा मैच खोजने के लिए, समवर्ती उपयोगकर्ताओं की अपेक्षित अधिकतम मात्रा के साथ बस अपने वेबपेज को प्रोफाइल करें और फिर अपने विज्ञापनकर्ता को 125% ~ 150% अधिकतम मापी गई मेमोरी दें।

ध्यान दें कि JSF 2.0 ने राज्य प्रबंधन में बहुत सुधार किया है। यह आंशिक राज्य को बचाने के लिए संभव है (उदाहरण के लिए केवल<h:form> से पूरे सामान के बजाय सहेजा जाएगा <html>सब समाप्त करने के लिए जिस तरह से)। उदाहरण के लिए मोआजरा ऐसा करता है। 10 इनपुट फ़ील्ड (प्रत्येक एक लेबल और संदेश के साथ) और 2 बटन के साथ एक औसत फॉर्म 1KB से अधिक नहीं लेगा। सत्र में 15 विचारों के साथ, प्रति सत्र 15KB से अधिक नहीं होना चाहिए। ~ 1000 समवर्ती उपयोगकर्ता सत्रों के साथ, 15MB से अधिक नहीं होना चाहिए।

आपकी चिंता सत्र या अनुप्रयोग दायरे में वास्तविक वस्तुओं (प्रबंधित बीन्स और / या डीबी संस्थाओं) पर अधिक केंद्रित होनी चाहिए। मैंने बहुत सारे कोड और परियोजनाएं देखी हैं जो अनावश्यक रूप से एक सत्र स्कॉप्ड बीन के स्वाद में जावा की मेमोरी में संपूर्ण डेटाबेस तालिका को डुप्लिकेट करता है जहां रिकॉर्ड्स को फ़िल्टर / समूह / व्यवस्थित करने के लिए SQL के बजाय जावा का उपयोग किया जाता है। ~ 1000 रिकॉर्ड के साथ, यह आसानी से प्रति उपयोगकर्ता सत्र 10MB से अधिक हो जाएगा ।


1
क्या आप # 2 को स्पष्ट कर सकते हैं? घटक ट्री को केवल प्रत्येक अनुरोध पर फिर से क्यों नहीं बनाया जा सकता है? अनुरोधों के बीच वास्तव में किस राज्य को संग्रहीत करने की आवश्यकता है और क्यों? ऐसा लगता है कि अनुरोधों के बीच घटक पेड़ को बचाने का एकमात्र कारण प्रदर्शन के लिए होगा।
रयान

यहां अधिक ध्यान केंद्रित प्रश्न: stackoverflow.com/questions/7349174/…
रयान

आपका जवाब मेरे लिए बहुत स्पष्ट था! जेएसएफ प्रदर्शन और मापनीयता के बारे में प्रोग्रामर के कार्यान्वयन से आंतरिक संबंध हैं! यह सही तरीके से तकनीक का उपयोग करने के लिए जानने की जरूरत है!
लुकास बातिस्तुसी

"बस परिवादी को पर्याप्त स्मृति दें।" एर्म, मुझे आभास होता है कि हम यहां उद्यम स्तर के सामान पर बात कर रहे हैं, यदि हम हजारों समवर्ती उपयोगकर्ता सत्रों के बारे में बात कर रहे हैं। यदि आपके पास किसी उद्यम में एंटरप्राइज़ स्तर के उपकरण हैं, तो आप घर पर अपने लिनक्स बॉक्स में बस "पर्यवेक्षक को पर्याप्त मेमोरी नहीं दे सकते हैं"।
स्टु

आपका उत्तर बहुत स्पष्ट था और इसके लिए धन्यवाद। यदि javax.faces.PARTIAL_STATE_SAVING को सही पर सेट किया गया है तो JSF फ़्लैश स्कोप गायब क्यों हो गया। getFacesContext ()। getExternalContext ()। getFlash () डाला गया ("बिल्डिंगआईड", बिल्डिंगआईड)।
मई Thet
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.