مقالات
2005/01/28 - i
پياده سازي ConnectionManager براي استفاده مناسب از Pooling
مقدمه

استفاده مناسب از Connection Pooling در برنامه يكي از مهمترين مباحث در زمينه برنامه نويسي وب مي باشد. عمده مديريت Connection Pool  را سرور  به عهده مي گيرد و شما نبايد به عنوان مثال نگران  تخصيص كانكشنهاي هاي بلا استفاده در Pooling  به درخواست جديد كانكشن در برنامه باشيد. اما يكسري نكات را براي كمك به اين مديريت بايد در نوشتن برنامه خود رعايت كنيد . براي دانستن آن نكات مطلب استفاده بهينه از Connection در دات نت را بخوانيد.اما اين كافي نيست . فرض كنيد كه برنامه شما داراي بلوك A و B باشد . در بلوك A درخواست بازكردن يك كانكشن وجود دارد و قبل از بستن آن كانكشن ، به بلوك B مي رود و در بدنه آن هم در خواست بازكردن يك كانكشن صادر مي شود در انتها بلوك B‌ كانكشن بسته و در انتهاي بلوك A هم كانكشن بسته شود . با فرض اين كه تمام اصول استفاده بهينه از Connection در دات نت هم رعايت شده باشد بازهم يك جاي كار ايراد دارد . آن هم درخواست دوبار باز شدن يك كانكشن كه اكنون باز است و دوبار بسته شدن همان كانكشن. حال اگر بحث Multi Threading را هم اضافه كنيد ،‌ابعاد مشكل پيچيده تر مي گردد.
 اما راه حل مناسبي وجود دارد ،‌آن هم داشتن يك كلاس به عنوان Connection Manager آن هم به صورت Singleton . در اين مقاله يك نمونه از اين كلاس را با زبان Visual Basic پياده سازي كردم كه حالت  Multi Threading  هم در نظر گرفته شده است.  توصيه مي كنم حتما در برنامه هايتان از آن و يا نمونه اي از اين الگو استفاده كنيد . بهتر است كه اين كلاس را به لايه DataAccess برنامه اضافه كنيد.

متن اين كلاس در فايل ConnectionManager.zip براي دانلود موجود است.

پياده سازي كلاس ConnectionManager

نام كلاس را ConnectionManager انتخاب كنيد و Constructor آنرا به حالت Private تبديل كنيد . اين به خاطر پياده سازي مدل Singleton است. متاسفانه در اين مقاله مجال پرداختن به بحث  Singleton Design Pattern نيست. تنها بايد اشاره كنم كه در طول زمان حيات  يك برنامه در زمان اجرا آن ،‌از كلاس Singleton تنها و تنها يك Instance بايد در حافظه باشد. در نظر گرفتن اين Pattern براي كلاس ما بسيار الزامي است.

Private Sub New()

End Sub

سپس دو خط زير را به ابتداي كلاس اضافه كنيد

Imports System.Threading

Imports System.Data.SqlClient

تعريف متغييرهاي لازم 

Private ConnectionCounter As Integer

Private ConnectionString As String

Private Shared CMS As Hashtable = New Hashtable

براي دادن مقدار اوليه به متغيير هاي تعريف شده در New كدهاي زير را مي نويسيم كه در آن به جاي DB و UID و PWD مقادير مناسب را جايگزين مي كنيد.

Private Sub New()

    ConnectionCounter = 0

    ConnectionString = _

          "server=Server;database=DB;uid=UID;pwd=PWD"

End Sub

متغيير CMS كه از نوع HashTable مي باشد براي نگهداري Instance از كلاس ConnectionManager به ازاء هر Thread مي باشد كه key آن هم CurrentThread مي باشد . حال روش دسترسي به  Instance از اين كلاس را كه به ازاء هر Thread تنها و نتها يك نسخه در حافظه است  پياده سازي مي كنيم. آنرا به صورت يك Shared Property به صورت زير مي نويسيم.

Public Shared ReadOnly Property Instance() As ConnectionManager

    Get

       If (Not CMS.Contains(Thread.CurrentThread)) Then

           CMS.Add(Thread.CurrentThread, New ConnectionManager)

       End If

       Return CType(CMS(Thread.CurrentThread), ConnectionManager)

    End Get

End Property

حال دو متد GetConnection و ReleaseConnection  براي گرفتن و آزاد كردن كانكشن از كلاس را پياده سازي مي كنيم .

Public Function GetConnection() As SqlConnection

    ConnectionCounter += 1

    If (ConnectionCounter = 1) Then

        Connection = New SqlConnection(ConnectionString)

        Connection.Open()

    End If

    Return Connection

End Function

 

Public Function ReleaseConnection() As SqlConnection

    ConnectionCounter -= 1

    If (ConnectionCounter = 0) Then

        Connection.Close()

        Connection = Nothing

    End If

End Function

كار تمام شد. حال اين كلاس را مي توانيد در برنامه خود اضافه نمائيد و با خيال راحت براي گرفتن يك كانكشن خط زير را بنويسيد

ConnectionManager.Instance.GetConnection()

و براي آزاد كردن كانكشن خط زير را بنويسيم.

ConnectionManager.Instance.ReleaseConnection()

نوشته شده در ساعت 13:43 ايميل به دوستان نظر خوانندگان

مقالات من
آخرين مطالب

نقل از مطالب اين سايت با ذكر منبع مجاز ميباشد

( Summery )