เหตุใด JSF จึงบันทึกสถานะของส่วนประกอบ UI บนเซิร์ฟเวอร์


108
  1. JSF บันทึกสถานะของส่วนประกอบ UI บนฝั่งเซิร์ฟเวอร์จนถึงช่วงเวลาใดและเมื่อใดที่ข้อมูลสถานะของคอมโพเนนต์ UI จะถูกลบออกจากหน่วยความจำเซิร์ฟเวอร์ ในฐานะผู้ใช้ที่ล็อกอินบนแอปพลิเคชันจะสำรวจหน้าต่างๆสถานะของส่วนประกอบจะยังคงสะสมอยู่บนเซิร์ฟเวอร์หรือไม่

  2. ฉันไม่เข้าใจว่าการรักษาสถานะส่วนประกอบ UI บนเซิร์ฟเวอร์มีประโยชน์อย่างไร!? การส่งผ่านข้อมูลที่ตรวจสอบแล้ว / แปลงไปยังถั่วที่มีการจัดการโดยตรงไม่เพียงพอหรือไม่ ฉันสามารถหรือฉันควรพยายามหลีกเลี่ยงได้หรือไม่?

  3. นั่นไม่ใช้หน่วยความจำมากเกินไปในฝั่งเซิร์ฟเวอร์หรือไม่หากมีเซสชันผู้ใช้พร้อมกันหลายพันเซสชัน ฉันมีแอปพลิเคชันที่ผู้ใช้สามารถโพสต์บล็อกในบางหัวข้อได้ บล็อกนี้มีขนาดค่อนข้างใหญ่ เมื่อจะมีการโพสต์กลับหรือขอดูบล็อกข้อมูลขนาดใหญ่นี้จะถูกบันทึกเป็นส่วนหนึ่งของสถานะของส่วนประกอบหรือไม่? สิ่งนี้จะกินหน่วยความจำมากเกินไป นี่ไม่น่ากังวลเหรอ?


อัปเดต 1:

ตอนนี้ไม่จำเป็นต้องบันทึกสถานะขณะใช้ JSF อีกต่อไป การใช้งาน Stateless JSF ประสิทธิภาพสูงพร้อมให้ใช้งาน ดูบล็อกนี้และคำถามนี้เพื่อดูรายละเอียดและการสนทนาที่เกี่ยวข้อง นอกจากนี้ยังมีปัญหาที่เปิดอยู่เพื่อรวมไว้ในข้อกำหนด JSF ซึ่งเป็นตัวเลือกในการจัดเตรียมโหมดไร้สถานะสำหรับ JSF (PS พิจารณาลงคะแนนสำหรับปัญหานี้และนี้ถ้านี้เป็นคุณสมบัติที่มีประโยชน์สำหรับคุณ.)


ปรับปรุง 2 (24-02-2556):

ข่าวดีMojarra 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

เหตุใด JSF จึงต้องบันทึกสถานะของส่วนประกอบ UI ทางฝั่งเซิร์ฟเวอร์

เนื่องจาก HTTP ไม่มีสถานะและ JSF เป็นสถานะ โครงสร้างคอมโพเนนต์ JSF อาจมีการเปลี่ยนแปลงแบบไดนามิก (เป็นโปรแกรม) JSF เพียงแค่ต้องการทราบสถานะที่แน่นอนเหมือนเดิมเมื่อฟอร์มถูกแสดงไปยัง enduser เพื่อให้สามารถประมวลผลวงจรชีวิต JSF ทั้งหมดได้สำเร็จตามข้อมูลที่จัดเตรียมโดยโครงสร้างส่วนประกอบ JSF ดั้งเดิมเมื่อส่งแบบฟอร์มกลับไป เซิฟเวอร์. โครงสร้างคอมโพเนนต์ให้ข้อมูลเกี่ยวกับชื่อพารามิเตอร์การร้องขอตัวแปลง / ตัวตรวจสอบที่จำเป็นคุณสมบัติ bean ที่ถูกจัดการที่ถูกผูกไว้และวิธีการดำเนินการ


JSF บันทึกสถานะของคอมโพเนนต์ UI บนฝั่งเซิร์ฟเวอร์จนถึงช่วงเวลาใดและเมื่อใดที่ข้อมูลสถานะของคอมโพเนนต์ UI จะถูกลบออกจากหน่วยความจำเซิร์ฟเวอร์

คำถามทั้งสองนี้ดูเหมือนจะเดือดดาลเหมือนกัน อย่างไรก็ตามนี่เป็นการใช้งานเฉพาะและขึ้นอยู่กับว่าสถานะถูกบันทึกไว้บนเซิร์ฟเวอร์หรือไคลเอนต์ การใช้งานที่เหมาะสมเล็กน้อยจะลบออกเมื่อหมดอายุหรือเมื่อคิวเต็ม ตัวอย่างเช่น Mojarra มีขีด จำกัด เริ่มต้นที่ 15 มุมมองเชิงตรรกะเมื่อการบันทึกสถานะถูกตั้งค่าเป็นเซสชัน สามารถกำหนดค่าได้ด้วยพารามิเตอร์บริบทต่อไปนี้ในweb.xml:

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

ดูคำถามที่พบบ่อยของ Mojarraสำหรับพารามิเตอร์เฉพาะของ Mojarra และคำตอบที่เกี่ยวข้องcom.sun.faces.numberOfViewsInSession เทียบกับ com.sun.faces.numberOfLogicalViews


ในฐานะผู้ใช้ที่ล็อกอินบนแอปพลิเคชันจะสำรวจหน้าต่างๆสถานะของส่วนประกอบจะยังคงสะสมอยู่บนเซิร์ฟเวอร์หรือไม่

ในทางเทคนิคนั้นขึ้นอยู่กับการนำไปใช้งาน หากคุณกำลังพูดถึงการนำทางแบบหน้าต่อหน้า (เพียงแค่รับคำขอ) Mojarra จะไม่บันทึกอะไรในเซสชัน หากเป็นคำขอ POST (รูปแบบที่มีลิงก์ / ปุ่มคำสั่ง) Mojarra จะบันทึกสถานะของแต่ละฟอร์มในเซสชันจนถึงขีด จำกัด สูงสุด สิ่งนี้ช่วยให้ enduser สามารถเปิดหลายรูปแบบในแท็บเบราว์เซอร์ต่างๆในเซสชันเดียวกัน

หรือเมื่อตั้งค่าการบันทึกสถานะเป็นไคลเอนต์ JSF จะไม่จัดเก็บอะไรในเซสชัน คุณสามารถทำได้โดยใช้พารามิเตอร์บริบทต่อไปนี้ในweb.xml:

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

จากนั้นจะต่ออนุกรมกับสตริงที่เข้ารหัสในช่องอินพุตที่ซ่อนอยู่พร้อมชื่อjavax.faces.ViewStateของแบบฟอร์ม


ฉันไม่เข้าใจว่าประโยชน์ของการรักษาสถานะขององค์ประกอบ UI บนฝั่งเซิร์ฟเวอร์คืออะไร การส่งผ่านข้อมูลที่ตรวจสอบแล้ว / แปลงไปยังถั่วที่มีการจัดการโดยตรงไม่เพียงพอหรือไม่ ฉันควรพยายามหลีกเลี่ยงหรือไม่

นั่นไม่เพียงพอที่จะรับรองความสมบูรณ์และความแข็งแกร่งของ JSF JSF เป็นเฟรมเวิร์กแบบไดนามิกที่มีจุดเข้าควบคุมจุดเดียว หากไม่มีการจัดการของรัฐหนึ่งจะสวมรอยสามารถ / สับร้องขอ HTTP ในวิธีการบางอย่าง (เช่นการจัดการกับdisabled, readonlyและrenderedแอตทริบิวต์) เพื่อให้ JSF ทำสิ่งที่แตกต่างกันและอื่นอาจ hazardful- แม้จะมีแนวโน้มที่จะเกิดการโจมตี CSRF และฟิชชิง


และจะไม่ใช้หน่วยความจำมากเกินไปในฝั่งเซิร์ฟเวอร์หากมีเซสชันผู้ใช้หลายพันคนพร้อมกัน? ฉันมีแอปพลิเคชันที่ผู้ใช้สามารถโพสต์บล็อกในบางหัวข้อได้ บล็อกนี้มีขนาดค่อนข้างใหญ่ เมื่อจะมีการโพสต์กลับหรือขอดูบล็อกบล็อกขนาดใหญ่จะถูกบันทึกเป็นส่วนหนึ่งของสถานะของส่วนประกอบ สิ่งนี้จะใช้หน่วยความจำมากเกินไป นี่ไม่น่ากังวลเหรอ?

หน่วยความจำมีราคาถูกเป็นพิเศษ เพียงแค่ให้แอปเซิร์ฟเวอร์มีหน่วยความจำเพียงพอ หรือหากแบนด์วิดท์เครือข่ายถูกกว่าสำหรับคุณเพียงแค่เปลี่ยนสถานะการบันทึกเป็นฝั่งไคลเอ็นต์ ในการค้นหาคู่ที่ดีที่สุดเพียงแค่ stresstest และสร้างโปรไฟล์เว็บแอปของคุณด้วยจำนวนผู้ใช้พร้อมกันสูงสุดที่คาดไว้จากนั้นให้เซิร์ฟเวอร์แอปมากกว่า 125% ~ 150% ของหน่วยความจำที่วัดได้สูงสุด

โปรดทราบว่า JSF 2.0 ได้ปรับปรุงการจัดการสถานะเป็นอย่างมาก เป็นไปได้ที่จะบันทึกสถานะบางส่วน (เช่นเฉพาะสิ่งที่<h:form>จะถูกบันทึกแทนที่จะเป็นข้อมูลทั้งหมดตั้งแต่ต้น<html>จนจบ) ตัวอย่างเช่น Mojarra ทำเช่นนั้น รูปแบบเฉลี่ยที่มีช่องป้อนข้อมูล 10 ช่อง (แต่ละปุ่มมีป้ายกำกับและข้อความ) และ 2 ปุ่มจะใช้เวลาไม่เกิน 1 KB ด้วยการดู 15 ครั้งในเซสชันที่ไม่ควรเกิน 15 KB ต่อเซสชัน ด้วยเซสชันผู้ใช้ที่ใช้งานพร้อมกัน ~ 1,000 เซสชันไม่ควรเกิน 15MB

ข้อกังวลของคุณควรมุ่งเน้นไปที่วัตถุจริง (ถั่วที่มีการจัดการและ / หรือแม้แต่เอนทิตี DB) ในขอบเขตเซสชันหรือแอปพลิเคชัน ฉันเคยเห็นโค้ดและโปรเจ็กต์มากมายที่ทำซ้ำตารางฐานข้อมูลทั้งหมดโดยไม่จำเป็นลงในหน่วยความจำของ Java ในรูปแบบของเซสชันที่กำหนดขอบเขตซึ่ง Java ถูกใช้แทน SQL เพื่อกรอง / จัดกลุ่ม / จัดเรียงระเบียน ด้วย ~ 1000 บันทึกที่ได้อย่างง่ายดายจะไปมากกว่า 10MB ต่อเซสชันของผู้ใช้


1
คุณสามารถชี้แจง # 2? เหตุใดจึงไม่สามารถสร้างโครงสร้างส่วนประกอบในแต่ละคำขอได้ จำเป็นต้องจัดเก็บสถานะใดระหว่างคำขอและเพราะเหตุใด ดูเหมือนว่าเหตุผลเดียวที่จะบันทึกโครงสร้างส่วนประกอบระหว่างคำขอคือเพื่อประสิทธิภาพ
Ryan

คำถามเพิ่มเติมที่นี่: stackoverflow.com/questions/7349174/…
Ryan

คำตอบของคุณชัดเจนมากสำหรับฉัน! ปัญหาเกี่ยวกับประสิทธิภาพ JSF และความสามารถในการปรับขนาดมีความสัมพันธ์ที่แท้จริงกับการใช้งานโปรแกรมเมอร์! ต้องรู้จักใช้เทคโนโลยีให้ถูกวิธี!
Lucas Batistussi

"ให้เซิร์ฟเวอร์แอปมีหน่วยความจำเพียงพอ" เอิ่มฉันรู้สึกว่าเรากำลังพูดถึงเรื่องระดับองค์กรที่นี่ถ้าเรากำลังพูดถึงเซสชันผู้ใช้พร้อมกันหลายพันเซสชัน หากคุณมีอุปกรณ์ระดับองค์กรในองค์กรคุณไม่สามารถ "ให้หน่วยความจำแอปเซิร์ฟเวอร์เพียงพอ" เหมือนในกล่อง linux ที่บ้านได้
สตู

คำตอบของคุณชัดเจนมากและขอบคุณสำหรับสิ่งนั้น เหตุใดขอบเขตแฟลช JSF จึงหายไปหากตั้งค่า javax.faces.PARTIAL_STATE_SAVING เป็น true getFacesContext (). getExternalContext (). getFlash () ใส่ ("buildingId", buildingId)
พฤ.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.