Java EJB Stateless vs. Stateful [Thai]

** Credit http://blog.pokpitch.com/tag/ejb

EJB Stateless vs. Stateful

หลังจากไปพยายามค้นคว้่าหาคำตอบ จากหลายๆเวบที่น่าเชื่อถือว่าการทำงานของ stateless และ stateful ซึ่งเป็น session beans บน EJBs นั้นมันต่างกันยังไง ต้องใช้ในงานแบบไหน วันนี้ก็พบคำตอบที่คิดว่าเข้าใจได้ง่ายที่สุดแล้ว
Stateless Session Bean
stateless นั้น client-session bean จะเรียก instance ของ stateless object ตัวไหนก็ได้ อาจจะเป็นตัวเดิม, ตัวที่สร้างขึ้นมาใหม่, หรือตัวอื่นๆ ที่มีอยู่ในขณะนั้น (make a call on a difference instance of the same object)  เราไปดูตามรูปเลยดีกว่า
clip_image001
รูปด้านบนนี้มี Caller แค่ตัวเดียวโดยจะ request ไปยัง instance ของ stateless session bean ทั้งหมด 3 ครั้ง โดยเราจะสังเกตได้ว่าบน container น้นจะมี instance
ของ stateless session bean อยู่ทั้งหมด 3 ตัว และให้สังเกตุว่าในแต่ละการ invoke นั้นจะ invoke ไปยัง instance ไหนก็ได้ โดยอาจจะเรียกไปยัง A , B หรือ C ก็ได้
clip_image002
เพื่อให้เห็นภาพชัดเจนขึ้นเมื่อมี Caller เพิ่มขึ้นมาเป็น 3 สังเกตว่าขึ้นขั้นตอนการ invoke นั้นจะเรียกไปได้ทุก instance ที่มีอยู่ในขณะนั้นเลย ถ้า caller 1 เรียก step 1 ไปยัง instance  B เมื่อถึงเวลา เรียก step ที่ 2 อาจจะเรียกไปยังที่ instance A หรือ C แทนก็ได้ (multiple callers may access any instance of a stateless object and have their call satisfied)
การที่ client – session bean ทำการ called แล้ว เราจะรู้ได้ไงว่า container จะเอา instance ตัวไหนมา serve ให้ ถ้าเป็น stateless session beans นั้น เราไม่สามารถบอกได้ครับเพราะตัว container นั้นจะจัดการให้เอง
Stateful Session Bean
สิ่งที่ต่างกันมากก็คือทางด้านของ stateful session bean นั้นแต่ละ instance ของตัวมันจะใช้กับ client-bean session เพียงตัวเดียวจนกว่ามันจะทำงานจบ state ของตัวมันซึ่งเราจะเรียก state นี้ว่า “conversational state”  (the instance variables represent the state of a unique client-bean session.)  ยกตัวอย่างให้เห็นภาพกันง่ายๆก็คือ shopping cart ครับ เรามี shopping cart object ซึ่งเป็น instance ของ stateful session bean ในแต่ละ instance นั้นจะทำงานร่วมกับลูกค้าเพียงคนเดยีวเท่านั้น ดังนั้นถ้ามีลูกค้าใช้งานระบบอยู่ 1,000 คน ก็จะมี stateful session bean instance อยู่ 1,000  instance เช่นกัน ถ้า Caller 1 เรียกใช้งาน instance A ไปแล้ว ทุกๆ state ของการทำงาน ก็จะต้องใช้ instance A เพียงอย่างเดียวจนจบ state
clip_image003
จากรูปจะเห็นได้ว่าทุกๆ Step นั้น Caller จะ Calls ไปยัง instance ตัวเดิมอยู่เสมอๆ ต่อไปเรามาดูในกรณีที่มี Callers มากกว่า 1 กันครับ
clip_image004
สังเกตว่า Caller 1 เรียกไปยัง instance “Neo the One” ในขณะที่ Caller 2 และ 3 ก็เรียกไปยัง instance “Neo the One” เช่นเดียวกัน แต่จะโดน block เอาไว้ทั้งหมด เนื่องจาก Caller 1 และ  instance “Neo the One” นั้นยังอยู่ใน state ที่เรียกว่า “conversational state” นั่นเอง ทาง container จะทำการ new instance มาให้ Caller 2 และ Caller 3 ใช้แทน

0 comments:

Loading