สิ่งที่ผมรู้ หากคุณอ่าน คุณจะรู้ตามผมไปด้วย

13-10-2008

มาทำ Connection Pooling กันเถอะ

Filed under: มาทำ Connection Pooling กันเถอะ — ejeepss @ 09:08:45

ระบบงานที่มีการติดต่อกับฐานข้อมูลตลอดเวลา หรือติดต่อบ้าง ไม่ติดต่อบ้าง หรือมีจำนวน Client เข้ามาติดต่อเป็นจำนวนมาก เปิดฐานข้อมูล แล้วก็ปิด แล้วรู้หรือไม่ครับ ว่ามันทำงานอย่างไร การเรียกใช้ฐานข้อมูลแต่ละครั้ง อย่างน้อยจะต้องมี Overhead ในส่วนของการสถาปนาการเชื่อมต่อ ซึ่งจุดนี้ครับ เป็นหัวใจครับ หากเราลดการสถาปนาการเชื่อมต่อกับฐานข้อมูลได้ การติดต่อระหว่าง Client ต่างๆ ที่จะเข้ามานั้น ก็จะมีประสิทธิภาพมากขึ้น

ก่อนอื่น เรามาดูภาพรวมของเดิมก่อนนะครับ

เมื่อ App1 ติดต่อ Database เป็นครั้งแรกนั้น จะสร้าง Connection1 ขึ้น และโดยค่า Default แล้วนั้น จะสร้าง Pooling โดยอัตโนมัติ แม้ว่าจะปิด App1 ไปแล้วก็ตาม พอมี App ใด ๆ เรียกเข้ามาเดี่ยว ๆ อีก ก็จะใช้ Connection1 เข้าไปค้นข้อมูลในฐานข้อมูลโดยอัตโนมัติ แต่หากเกิดกรณี App1 ทำงานอยู่ และมี App2, App3, App4, App5 เข้ามาพร้อมกัน หลังจากนั้น จะทำให้เกิดการเปิด Connection2, Connection3 … Connection5 ตามลำดับ จะเห็นได้ว่าจะต้องเสียเวลาสถาปนาการเชื่อมต่อ Connection2-5 ขึ้นมา ซึ่งเราสามารถลดการสถาปนาได้ เช่น เมื่อ App1 เรียกใช้งาน Database จะทำการสถาปนาการเชื่อมต่อ Connection1, Connection2 และ Connection3 ทันที (ซึ่งแน่นอน ย่อมเสียเวลาเป็นธรรมดาในการเรียกครั้งแรก) และเมื่อ App2, App3 เข้ามาใช้งานพร้อมๆ กัน App2, App3 ไม่จำเป็นต้องสถาปนาการเชื่อมต่อใหม่ เรียกใช้งานได้ทันที และหาก App ใด ไม่ได้เชื่อมต่อ App อื่นๆ สามารถเข้ามาใช้ได้ Connection1-3 ได้โดยอัตโนมัติ ดังภาพทางด้านล่าง

ดังภาพจะเห็นว่า หากกำหนด Min Pool size =3 จะสร้าง connection ให้อัตโนม้ติ 3 connection ซึ่งจะทำให้ Application เข้าใช้งานได้พร้อมกันทันที 3 Application หาก App ตัวที่ 4 เข้าใช้งาน จึงจะทำการสถาปนาการเชื่อมต่อกับ Database เพิ่ม ซึ่งจุดนี้สามารถกำหนดได้ว่า สามารถกำหนด Max Pool Size ได้เท่าไหร่ ..

ยังไม่เห็นภาพใช่ไหมครับ ถ้างั้นดูขั้นตอนการทำกันนะครับ

สภาพแวดล้อมการทดสอบ

  • Client
    - OS Windows Vista
    - Visual Studio 2008 -> Windows Application
  • Database
    - OS Windows 2003 Server
    - Microsoft SQL Server 2000 (เนื่องจากจะใช้ SQL Profiler)

เริ่มต้นด้วย Client สร้าง Windows App ขึ้นมา 1 ตัว โดยเขียนด้วยภาษา C# เขียนให้เปิดฟอร์ม ก็ Connect และ Disconnect กับ Database เลย ครับ Code นิดเดียวครับ เพื่อเป็นการทดสอบ

สังเกตุว่า ใน Connection String เป็นค่า Default ครับ

cn = new SqlConnection();
cn.ConnectionString =
“Data Source=192.168.100.20;Initial Catalog=Consoto;User Id=connection_user;Password=password;”
cn.Open();
cn.Close();
label1.text = “Disconnect!!!”;

เพียงเท่านี้ เมื่อ Run จะปรากฎดังภาพ

เมื่อติดต่อฐานข้อมูล และปิดการเชื่อมต่อได้ จะแสดงดังภาพทางด้านบน ซึ่งเมื่อ Run ผ่านแล้ว ก็เก็บไว้ก่อนครับ ….. คราวนี้มาดูฝั่ง Server บ้างครับ โดยการทดสอบนั้น เราใช้ SQL 2000 ตัวเต็ม เพื่อใช้ SQL Profiler เพื่อดู Connection ที่เข้ามา เริ่มกันเลยดีกว่า

เลือก Start-> Program files -> Microsoft SQL Server -> Profiler

เลือก new Traceเลือกกรองเฉพาะ Session ก็พอครับ
หลังจากนั้น กด Start ได้เลยครับ โปรแกรม Profile จะทำการ Trace โดยดักจับการทำงานที่เราได้กรองไว้ เมื่อ Start แล้ว ให้กลับไปที่ client RUN WinApp ตัวที่ได้เขียนไว้ แล้วกลับมาดูที่ Server จะแสดงดังภาพ

โดยบรรทัดแรก แจ้งว่า Trace เริ่มทำงาน
บรรทัดที่ 2 บอกว่า โปรแกรม SQL Profiler เรียกใช้งาน Database โดยใช้สิทธิ SA
บรรทัดที่ 3 บอกว่า มี Client เข้ามาใช้งาน โดยมี User ที่เข้ามา ชื่อ connection_user
* สังเกตุได้ว่า WinApp ที่เราเขียนขึ้นมานั้น ปิด Connection ไปแล้ว แต่ว่า connection ยังค้างอยู่ แสดงว่า Pooling ได้เปิด โดย Default แล้ว

คราวนี้กลับมาที่ WinApp ใหม่ ลองเพิ่ม Min Pool Size และ Max Pool Size ดังภาพ

สังเกตุได้ว่า ได้เพิ่ม Min Pool size =10 แสดงว่าอย่างน้อย เวลาใช้งานจะมี Pool ไว้ทั้งสิ้น 10 Pool แต่หากยังมีเครื่องที่ 11 ขึ้นไปเข้ามาใช้งาน ก็จะทำการเปิด Connection มากสุด 15 Connection เท่านั้น เนื่องจากได้กำหนดไว้ที่ Max Pool Size
* การกำหนด Min Pool Size น้อยไป หรือมากไป อาจไม่ได้ช่วยเพิ่มประสิทธิภาพครับ อาจลดประสิทธิภาพ เพราะฉะนั้น ต้องกำหนดให้ตรงกับระบบงานของท่านนะครับ

ผมปิด Trace แล้วเปิดใหม่ครับ เห็นชัดเจนดี เมื่อลอง Run WinApp จะปรากฎดังภาพครับ เปิดทีเดียว 10 Connection เลย .. หากมี App ตัวอื่นจะเรียกใช้ ก็สามารถมาหยิบ Pool ที่ว่างไปใช้ทันที

* จะกำหนด Min Pool Size มากหรือน้อยเพียงใด ขึ้นอยู่กับระบบของท่านนะครับ เปิดมากไม่ใช่จะดีเสมอไปนะครับ

ขอบพระคุณที่สนใจอ่าน

Reference :

06-10-2008

มาทำ SQL Server Session State กันเถอะ

Filed under: มาทำ SQL Server Session State กัน — ejeepss @ 08:40:03

อะไรคือ 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 :

Powered by WordPress