มาทำ Connection Pooling กันเถอะ
ระบบงานที่มีการติดต่อกับฐานข้อมูลตลอดเวลา หรือติดต่อบ้าง ไม่ติดต่อบ้าง หรือมีจำนวน 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 :
- asp.dotnetheaven.com : http://asp.dotnetheaven.com/howto/doc/adoplus/connectionpooling.aspx





















