Connection Pooling


ใจความสำคัญ
– Pooling ทำที่ฝั่ง database server ถือถ้าเรา connect จากต่าง application กันแต่ Connection string เหมือนกันก็ใช้ Pooling เดิม
– ค่อนข้างที่จะ work กับเฉพาะ web application ส่วน window application ไม่ค่อย work ควรหนีไปใช้ COM+ หรือ web service เอา

เมื่อมีการเปิด Connection ไปยัง Database จะทำให้เกิดการใช้งานทรัพยากรของระบบในจำนวนมากและทำให้ Application ที่ทำการเปิด Connection นั้นทำงานช้าลงไปด้วย

จากปัญหาดังกล่าวใน ADO.NET จึงมีวิธีการในการจัดการกับเรื่องดังกล่าวด้วยการสร้าง Connection Pooling ขึ้นมา Connection Pooling จะเป็นที่เก็บ Connection ที่เปิดอยู่และสามารถที่จะนำ Connection นั้นกลับมาใช้ใหม่ได้อีก Connection pooling จะปล่อยConnection นั้นๆ ออกมาจาก Memory ต่อเมื่อ Connection สุดท้ายที่ Connect Database มีการปิดเรียบร้อยแล้ว
ข้อดีของการใช้ Connection Pooling ก็คือเรื่องการปรับปรุง Performance และรองรับการขยายขนาดของ Application ที่จะมีขนาดเพิ่มขึ้น
ข้อด้อยคือจะมีการเปิดการติดต่ออยู่กับ Database หรือหลายๆ Database อยู่ทั้งที่อาจจะไม่มีการใช้งาน Database นั้นและมันก็จะเปิดใช้ตลอดเวลา
ใน ADO.NET จะกำหนดให้ Connection Pool ถูกใช้งานไว้เป็น Default แต่ถ้าต้องการปิดก็ให้กำหนดใน Connection String โดยระบุให้Pooling=False
Connection Pool จะทำ Connection เป็นแบบ Idle หรือ Open หรือ Reuse ได้ แทนที่จะเปิด New connection ใหม่ทุกครั้งที่มีการRequest ขอติดต่อกับ Database เมื่อ Connection ถูกปิด หรือ ถูกเปิด มันจะส่งค่ากลับมายัง Pool และมีสถานะเป็น Idle จนกว่ามีRequest เพื่อขอ Connection มาใหม่ ถ้าเราใช้ Connection Pool อย่างมีประสิทธิภาพ คือ เปิดและปิดทุกครั้งของการ Connect DBก็จะทำให้มีการใช้ Resource ในปริมาณที่น้อย
ดังนั้นเราควรหาวิธีการที่จะใช้งาน Connection Pool ให้มีประสิทธิภาพที่ดีที่สุดเพื่อทำให้ Performance ของ Application ที่งานได้ดีที่สุด
การทำงานของ Connection Pooling
จากที่กล่าวมา Connection Pooling เป็นเหมือนกับภาชนะบรรจุ Connection ที่เปิดอยู่ และสามารถนำกลับมาใช้ได้ ดังนั้นจำเป็นที่จะต้องมีการ Identify แต่ละ Connection ที่ถูก Request เข้ามาใน Connection Pooling ว่า Connection จะถูกสร้างใหม่หรือจะ Reuse จากที่ถูกเปิดอยู่แล้ว ให้นำกลับไปใช้อีก ตัว Connection Pooling จะใช้ Connection String ของ Connection นั้นๆ เป็นตัวตัดสินใจ
กรณีที่มี Connection String อื่นเข้ามาใน Connection Pooling ที่ต่างกับที่มีอยู่มันจะสร้าง Connection ตัวใหม่ลงไปในConnection Pooling
ดังนั้น เราจะมี 1 Connection Pool ต่อ 1 Connection String และไม่ใช่ต่อ 1 Database.
ด้านล่างนี้จะแสดงตัวอย่างให้เห็นเมื่อมี Request ครั้งที่ 2 ที่ต้องการ Connection ใหม่เข้ามา มันจะได้รับบริการจาก Connection Pool โดยไม่ต้องสร้าง New Connection ใหม่
ประเด็นที่ผมอยากนำเสนอคือว่า เราควรใช้ Connection String เป็นชื่อเดียวกันหลายๆ App เท่าีที่จะทำได้
เพื่อให้มันกลับไป Reuse Connection Pool ตัวเดิมหรือใน App หนึ่งๆ ไม่ควรที่จะมีการเปิด Connection ไป Database ก้อนเดียวโดยใช้หลายๆ Connection String
อย่างเช่น ผมสร้าง ASP.NET Page สำหรับ Key Order สินค้า แล้วทำการ Connect เข้า Database Server แบบนี้
Dim Conn As New SqlConnection(“server=Serverdb1;database=ERPDb;UID=sa;PWD=password”)
Conn.Open()
ปรากฏว่าผมสร้างอีกหน้าเป็นการ Report ยอดขายแล้วก็เปิด Connection แบบนี้อีกโดยเพราะสาเหตุจากการรีบทำงานให้เสร็จ
Dim Conn As New SqlConnection(“server=192.168.10.100;database=ERPDb;UID=sa;PWD=password”)
Conn.Open()
และมีการทำรูปแบบนี้ไปเรื่อยๆ
หรือในกรณีที่บริษัทสร้าง WebApp เ็ป็น Intranet และมีการสร้างหลายๆ WebApp และแต่ละงานอาจไม่ได้รวมอยู่ใน Solution เดียวกัน เพราะอาจจะแบ่งงานให้ Developer หลายๆ คนดังนั้นต่างคนก็จะประกาศ Connection String ไม่เหมือนกัน ทำให้ไปสร้าง Pool ใน Connection Pooling เยอะๆ โดยไม่จำเป็นและสุดท้ายก็จะเกิดปัญหาทำให้ Connection Pooling เต็ม ซึ่งจริงๆ เราอาจเปิดปิด Connection ตามปกติอยู่แล้วครับ
เรื่อง Connection Pooling นั้น จะมีประโยชน์อย่างมากเลยครับ หากใช้กับ Web application (ASP.NET) เนื่องจากการเปิด ปิด Connection นั้นกระทำที่ Process ฝั่ง Web Server ที่เดียวเท่านั้น ดังนั้นมันจึง Control ตัว Connection ได้ดี
     แต่สำหรับ Windows application แล้วนั้น มันไม่เป็นไปตามที่ต้องการครับ คือมันจะ Pooling ให้ต่อ Application Process เท่านั้นครับ ถึงแม้ว่าแต่ละ Application Process จะใช้ Connection String เดียวกันเป๊ะก็ตาม ดังนั้น ถ้าเปิด Application เดียวกันไว้หลายตัว (แม้บนเครื่อง Computer เดียวกันก็ตาม) ถ้าใช้ sp_who2 ดูแล้วก็จะพบว่า มีการเปิด Connection ไว้หลายตัว ตาม Application ที่เปิดอยู่ครับ ในเรื่องนี้นั้นมีวิธีการแก้ไขเพื่อรองรับระบบที่ต้องการการปรับขยายได้ครับ (Scalable) โดยการใช้ COM+, Web service และการใช้ Singleton Class ซึ่งเรื่องนี้มีข้อดี ข้อเสียต่างกัน
     สำหรับผมตอนนี้ผมใช้ COM+ อยู่ครับ ข้อดี คือ กิน resource ของ SQL Server น้อยมาก บริหารจัดการ resource ได้ดี ส่วนข้อเสียนั้น คือ การดูแลรักษา การติดตั้ง ค่อนข้างยุ่งยาก ซับซ้อน และ Performance อาจน้อยลงเพราะต้อง COM+ เป็นผู้ให้บริการที่เดียวครับ –> Scalable มากขึ้น Performance ก็ต้องน้อยลงบ้างล่ะครับ
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: