| 2005/01/28 - i |
| پياده سازي ConnectionManager براي استفاده مناسب از Pooling |
|
مقدمه
استفاده مناسب از Connection
Pooling در برنامه يكي از مهمترين مباحث در
زمينه برنامه نويسي وب مي باشد. عمده مديريت
Connection Pool را
سرور به عهده مي گيرد
و شما نبايد به عنوان مثال نگران تخصيص
كانكشنهاي هاي بلا استفاده در
Pooling به درخواست جديد كانكشن در
برنامه باشيد. اما يكسري نكات را براي كمك به اين
مديريت بايد در نوشتن برنامه خود رعايت كنيد . براي
دانستن آن نكات مطلب
استفاده بهينه از Connection در دات نت را
بخوانيد.اما اين كافي نيست . فرض كنيد كه برنامه شما
داراي بلوك A و
B باشد . در بلوك
A درخواست بازكردن يك
كانكشن وجود دارد و قبل از بستن آن كانكشن ، به بلوك
B مي رود و در بدنه آن هم
در خواست بازكردن يك كانكشن صادر مي شود در انتها بلوك
B كانكشن بسته و در انتهاي
بلوك A هم كانكشن بسته شود
. با فرض اين كه تمام اصول
استفاده بهينه از Connection در دات نت هم رعايت
شده باشد بازهم يك جاي كار ايراد دارد . آن هم درخواست
دوبار باز شدن يك كانكشن كه اكنون باز است و دوبار
بسته شدن همان كانكشن. حال اگر بحث
Multi Threading را هم اضافه كنيد ،ابعاد مشكل
پيچيده تر مي گردد. متن اين كلاس در فايل 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 Private Sub New() ConnectionCounter = 0 ConnectionString = _ "server=Server;database=DB;uid=UID;pwd=PWD" End Sub 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 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 ) |



