มาทำ SQL Server Session State กันเถอะ
อะไรคือ SQL Server Sessionstate? ก่อนที่จะตอบคำถามนี้ได้ ขอพูดภาพรวมก่อนนะครับ การทำงานของ Webapplication จะทำงานในแบบ Stateless คือไม่จำ Browser ใดๆ เลย .. เพราะฉะนั้น หาก Application ที่ RUN ต้องการจำได้ว่า Browser ไหน ทำอะไร ในกรณีที่ต้องการเก็บหรือเก็บค่าใดๆ ส่วนใหญ่จะเก็บไว้ใน Session ซึ่งหาก Application นั้นๆ เขียน Session[] เป็นจำนวนมาก ผลลัพท์ก็คือการกิน Memory ของเครื่อง ซึ่งหากบังเอิญ Application เรามีคนเข้าพร้อมๆ กันจำนวนมาก Memory ที่เก็บ session ก็จะถูกใช้ไปเรื่อยๆ ๆ ๆ ๆ (หรือหากถูกโจมตี ในรูปแบบกิน Session ไปเรื่อยๆ ล่ะก็) การทำ SQL Server Sessionstate ก็เป็นอีกหนึ่งทางออก
จากภาพทางด้านบน แสดงให้เห็นว่า เมื่อเวลา Browser ต่างๆ เรียกเข้ามา เครื่อง WebApplication (IIS) จะจัดการ Session ด้วยตนเอง และจัดเก็บใน Memory เครื่อง ซึ่งหากมี Browser จำนวนมากกว่านี้เข้ามา เช่น 1,000 Browser เข้ามาหรือมากกว่านั้น อาจเกิดปัญหา Memory ไม่พอใช้งานได้ ซึ่งหากสามารถเอา Session นี้ไปไว้ที่อีกเครื่อง ก็ย่อมจะลดภาระการทำงานให้กับเครื่อง WebApplication
ภาพทางด้านบน เป็นภาพรวมการทำงานที่นำเอา Session ต่างๆ ไปเก็บไว้ที่ Database Server อีกเครื่อง โดยมีขั้นตอนดังนี้
1. สร้าง WebApplication ทดสอบขึ้นมา 1 ตัว โดยเพื่อความเข้าใจผมจะเขียนสั้น ๆ 1 บรรทัด โดยขอดู Session ID ที่ Server ส่งมาให้
เปิด VS2008 สร้าง Project แล้วสร้าง Website โดยกำหนด Locatino เป็น HTTP และไว้ที่ Localhost -> session_state
ภายในหน้า Default.aspx ให้ Double Click เพื่อเข้าสู่การเขียน Source Code
ใน Page_Load ให้เพิ่ม บรรทัด
- Response.write (”My SessionID :” + Session.SessionID);
- กำหนด Session ง่าย ๆ สักหนึ่งตัว ไม่เช่นนั้น Session จะเปลี่ยนไปเรื่อย ๆ ที่ Browser เรียกใช้
Session[”username = “ejeepss”;
คลิ๊กขวาที่ Default.aspx ทางด้านขวามือใน Solution Explorer และเลือก View in browser จะแสดงดังภาพทางด้าน บน ซึ่ง Session ตัวนี้ใน Application จะเก็บไว้ใน Memory ซึ่งต่อไป เราจะย้ายสถานที่เก็บ ไปเก็บไว้ใน SQLServer ใน Server อีกตัว
ขั้นตอนแรก สร้าง ฐานข้อมูลสำหรับเก็บ Session เสียก่อน .. ซึ่งเราสามารถสร้างเองได้ แต่เมื่อมี Tools ให้เรียกใช้ ก็เรียกใช้เลยน่าจะดีกว่า โดยไปที่ Start -> Program file -> Microsoft Visual Studio 8 -> Visual Studio Tools -> Microsoft Visual Studio 2008 Command จะได้ command ดังภาพ ให้พิมพ์
- aspnet_regsql -S .\sqlexpress -E -ssadd -sstype p โดยที่
- -S หมายถึงระบุชื่อ Server ซึ่งในที่นี้คือเครื่องปัจจบัน โดยระบุถึง Instant ผมใช้ SQLExpress
- -E หมายถึงการ Authen เข้าไปใช้งานฐานข้อมูลใน Mode Windows Credentials
- -ssadd หมายถึง การเพิ่ม Session stage ในรูปแบบ SQLServer
- -sstype p หมายถึง การเก็บ SQLState นั้น เก็บในรูปแบบใด p หมายถึง ให้สร้างฐานข้อมูล ASPState และเก็บในนั้น หากต้องการสร้างฐานข้อมูลเอง ก็สามารถสร้างได้ โดยใช้โหมด c
* หากต้องการรายละเอียดเพิ่มเติม ให้พิมพ์ aspnet_regsql /? ซึ่งจะแสดง Help ของการใช้คำสั่งนี้
หากเข้า SQL Server Management Studio Express จะเห็นได้ว่ามี ฐานข้อมูล ASPState ขึ้นมา โดยมีโครงสร้างภายในพร้อมสรรพ แต่หากจะให้ Secure เพิ่มขึ้น การเข้าถึง Database ASPState นั้น จะต้องเข้าได้เฉพาะบาง User เท่านั้น ทำดังนี้
- เปลี่ยน Mode การ Authen SQLServer เป็น SQLServer and Windows Authentication Mode
- สร้าง User ชื่อ aspstate_user และกำหนด Password ให้ (* ชื่ออะไรก้ได้นะครับ)
- กำหนดสิทธิ์ ให้ aspstate_user ให้เข้าใช้งานได้แต่ Database ASPState เท่านั้น
โดยมีขั้นตอนประมาณนี้
กด OK เพื่อสร้าง User ซึ่ง SQL Server จะบังคับให้ Restart เพื่อเข้าสู่การ Authentication แบบใหม่
หลังจากนั้นกลับมาที่ WebApp ที่เขียน โดยให้เข้าไปเพิ่ม TAG SessionState ใน Web.config
โดยเพิ่มใน Tag <system.web> เพิ่ม Tag SessionState ดังนี้
<sessionState
mode=”SQLServer”
sqlConnectionString =”Server=.\sqlexpress;User ID=aspstage_user;Password=password;Trusted_Connection=False;”
sqlCommandTimeout =”20″
/>
ใน SQLConnectionString ให้กำหนดถึง Server อยู่ที่ใด รวมถึงชื่อ Username และ Password
ทดลองเรียก WebApplication อีกครั้ง
ครั้งนี้มาเปิดดูในฐานข้อมูล ASPState จะพบว่า Session ของ Browser ดังกล่าว มาอยู่ใน Table เรียบร้อย
ครั้งนี้เปิดหลาย ๆ Browser เพื่อดูผลลัพท์
จะเห็นได้ว่า มี Session เข้ามาเก็บเป็นจำนวนมาก ซึ่งในการทำงานจริงๆ จะช่วยลดภาระการจัดการ Session ของ Application ได้อีกระดับหนึ่ง
หวังว่าเรื่องนี้อาจเป็นประโยชน์กับท่านบ้างนะครับ
ขอบพระคุณที่สนใจอ่าน
Software ที่ใช้ :
- Windows XP SP3
- MS Visual Studio 2008
- IIS5.1
- SQL Server 2005 Express
Reference :
- ละเอียดดีครับ แต่ Script ล้วน ๆ : http://faqfront.com/document/sql-server-session-state
- MSDN เก่าหน่อย ใช้ไม่ได้ทั้งหมด : http://msdn.microsoft.com/en-us/library/ms972429.aspx
- Support Microsoft มีนิดเดียวเอง : http://support.microsoft.com/kb/317604
- Blog จากที่อื่น ละเอียดใช้ได้ : http://idunno.org/articles/277.aspx















