PDA

View Full Version : همه چیز درباره ی Connection Pooling



Behrouz_Rad
پنج شنبه 10 آذر 1384, 18:27 عصر
به طور خلاصه، Connection Pooling تکنیکی است که به منظور استفاده از Connection های فعال موجود به جای ایجاد Connection جدید به دیتابیس، به منظور صرفه جویی در زمانی دستیابی به داده های بانک اطلاعاتی استفاده می شود.
تکنیک Pooling در طراحی سیستم های تجاری و بزرگ، ارزش و اهمیت خاصی پیدا می کند.
البته ممکن است در ظاهر، سیستم های طراحی شده بدون استفاده از این تکنیک دارای توان بازدهی خوبی باشند اما به طور حتم در دراز مدت از کارایی و بازدهی آنها کاسته خواهد شد.
به عنوان مثال متوجه خواهید شد که سیستم طراحی شده، قادر به پاسخگویی و پردازش همزمان هزار تراکنش در دقیقه توسط ده کاربر است اما توان عملیاتی همین سیستم در پردازش درخواست های هزار کاربر که ممکن است در هر دقیقه موجب ده تراکنش شوند، به شکل محسوسی افت خواهد کرد.
این مشکل از آنجا ناشی می شود که ایجاد هر Connection به دیتابیس، اصطلاحا موجب ایجاد سربار بر روی سیستم کلاینت (یا در برنامه های وب، بر روی سرور( می شود.
این سربار به دلیل انجام مراحل مختلف قبول درخواست Connection به دیتابیس به وجود می آید; همانند تایید مجوز دسترسی به دیتابیس.
بیشتر مکانیزم هایی که به منظور ارتباط با دیتابیس ها مورد استفاده قرار می گیرند، به منظور جلوگیری از ایجاد این سربار، از تکنیک Connection Pooling استفاده می کنند.

Pool در فرهنگ لغت به معنای استخر و حوض و در جای دیگر به معنای استفاده مشترک از چیزی، بیان شده است.

همان طور که قبلا گفته شد، Connection Pooling از Connection های فعال و موجود، جهت ایجاد ارتباط با دیتابیس استفاده می کند و در حقیقت لیستی از Connection های موجود را برگشت می دهد.
در تکنیک Pooling، زمانی که کلاینت درخواست ایجاد ارتباط با دیتابیس را به برنامه می فرستد، به جای ایجاد مجدد Connection، این Connection از Pool استخراج شده و عملیات اتصال انجام می پذیرد.
شایان ذکر است که درگیری کمتر CPU با منابع و صرفه جویی در پهنای باند شبکه، از مزایای دیگر استفاده از این تکنیک است.
در ADO.NET، کلاس یا شی خاصی به منظور استفاده از تکنیک Connection Pooling وجود ندارد، در عوض، پرووایدرهایی که همراه با Net Framework. عرضه شده اند، به طور خودکار این عمل را انجام می دهند.
در پرووایدرهای SQL Server و Oracle، این تکنیک به طور خودکار اعمال و اجرا می شود.
در پرووایدرهای OLE DB و ODBC، این تکنیک با محدودیت و قابلیت های کمتری انجام می پذیرد.
توجه: هر چند که تکنیک Connection Pooling در اکثر پرووایدرها به شکل خودکار انجام می پذیرد، اما برنامه نویس قادر به ایجاد تنظیماتی در Connection String به منظور تغییر در برخی خواص Pooling می باشد.
اولین کاری که در این تکنیک انجام می پذیرد، پردازش Connection String ارسال شده به برنامه است.
Connection String بررسی می شود. در صورتی که Connection String ای در Pool مطابق با Connection String ارسال شده توسط کلاینت پیدا شود، از Connection String موجود در Pool جهت اتصال به دیتابیس استفاده خواهد شد.
اگر هیچ Connection ای در Pool وجود نداشته باشد، Connection String دریافت شده به منظور انجام عمل تطابق با درخواست های بعدی، در Pool قرار خواهد گرفت.
توجه مهم: Connection Pooling به بزرگ و کوچک بودن حروف، حساس است.
همچنین، Connection Pooling به ترتیب قرار گیری پارامترهای Connection String نیز حساس است.
به عنوان مثال، اگر دو Connection String یکسان با رعایت حروف بزرگ و کوچک و تعداد پارامترها به برنامه ارسال شود اما ترتیب قرار گیری پارامترها در دو Connection String متفاوت باشد، تکنیک Connection Pooling اعمال نمی شود. (پرووایدر ODP.NET که همان پرووایدر دیتابیس Oracle می باشد، از این قائده مستثنا است)
نکته مهم: به منظور اطمینان از اعمال تکنیک Pooling، حتما Connection String را در یک فایل یا رجیستری قرار داده و از نوشتن مستقیم آن در کد برنامه اجتناب کنید.
برنامه نویسان ASP.NET باید Connection String را در فایل Web.Config قرار دهند.

مثال زیر نحوه عمل تکنیک Connection Pooling را مشخص می کند:


string conString1 = "Data Source=localhost;" +
"Initial Catalog=FirstDB;Integrated Security=SSPI");

string conString2 = "Data Source=localhost;" +
"Initial Catalog=SecondDB;Integrated Security=SSPI");

SqlConnection con = new SqlConnection();

con.ConnectionString = conString1;
con.Open();

در اینجا (با فرض اینکه Pool خالی است و برای اولین بار درخواست اتصال به دیتابیس ارسال می شود)، رشته حاوی conString1 در Pool قرار خواهد گرفت. پس یک Pool ایجاد شد. نام آن را Pool A می گذاریم.


con.Close()

Connection به Pool A برگشت داده می شود.


con.ConnectionString = conString2;
con.Open();

دو خط فوق را در نظر بگیرید.
در خط اول، Connection String ای به شی con نسبت داده می شود که با Connection String مرتبه اول (conString1) متفاوت است.
به همین دلیل، در هنگام ارسال درخواست اتصال به برنامه، یک Pool جدید که حاوی conString2 است ایجاد می شود. نام آن را Pool B می گذاریم.


con.Close()

Connection به Pool B برگشت داده می شود.


con.ConnectionString = conString1;
con.Open();

حال، دو خط فوق را در نظر بگیرید.
از آنجایی که قبلا conString1 به عنوان یک Pool در مخزن Pool ها قرار گرفته، نیاز به ایجاد مجدد Connection نیست و Pool A استخراج شده و از آن جهت برقراری ارتباط با دیتابیس استفاده می شود. (صرفه جویی در زمان)


con.Close()

Connection به Pool A برگشت داده می شود.

نکاتی در مورد مثال فوق:
1) در هنگام فراخوانی متد Close، کانکشن فعال در Pool قرار خواهد گرفت.
در هنگام فراخوانی متد Open، پرووایدر، مخزن Pool ها را به منظور یافتن یک Pool مطابق با Connection String ارسالی جستجو می کند.

2) استفاده از Pool تنها زمانی انجام می پذیرد که دو Connection دقیقا شبیه به هم باشند.

3) اگر هیچ Pool ای در مخزن Pool ها وجود نداشته باشد، اولین Pool در زمانی فراخوانی متد Open ایجاد شده و در مخزن Pool ها قرار خواهد گرفت.
به طور پیش فرض، حداکثر 100 Pool در مخزن Pool ها قرار خواهد گرفت. (این مقدار توسط برنامه نویس قابل تغییر است)

تکنیک Connection Pooling در دیتابیس های SQL Server و Oracle:
مدیریت Pooling در دیتابیس های SQL Server و Oracle به طور خودکار توسط پرووایدرهای آنها انجام می پذیرد. اما برنامه نویس می تواند با ایجاد تغییراتی در Connection String، برخی از خواص آن را به دلخواه تغییر دهد.

موفق باشید.

PalizeSoftware
پنج شنبه 10 آذر 1384, 19:17 عصر
خیلی جالب و مفید بود
از زحمتی که کشیدید سپاسگذارم.
موفق باشید

aidinwashere
شنبه 12 آذر 1384, 01:52 صبح
بسیار مشتاق یادگیری آن بودم.
پیروز باشید

ealireza
سه شنبه 15 آذر 1384, 17:37 عصر
بسیار جالب بود
اگه میشه در مورد مکانیزم ADO.net 2 هم مقالاتی ارسال کنید

با تشکر

موفق باشید

jirjirakk
جمعه 07 بهمن 1384, 05:49 صبح
تشکر جناب راد

iekrang
سه شنبه 02 اسفند 1384, 11:39 صبح
مرسی.یه سری از ابهامات برطرف شد.

Arminizer_88
پنج شنبه 11 خرداد 1385, 09:00 صبح
ممنون.
خیلی دوست داشتم مطالب کاملی بردارش بخونم.

bahman.net
شنبه 17 تیر 1385, 23:56 عصر
مرسی خیلی جالب و مفید بود

mehdisiavashian
سه شنبه 20 شهریور 1386, 17:46 عصر
با تشکر از زحمتی که برای تهیه این مقاله کشیده اید:

اما برنامه نویس می تواند با ایجاد تغییراتی در Connection String، برخی از خواص آن را به دلخواه تغییر دهد.آیا در این مورد می توانید بیشتر توضیح دهید؟
با تشکر

Behrouz_Rad
سه شنبه 20 شهریور 1386, 21:27 عصر
واضح گفته شده.
Pooling دارای خواصی هست که قابلیت تنظیم اونها در Connection String وجود داره.
مثلا تعداد Pooling ها و یا زمان Pooling و ...

موفق باشید.

mehrdad201
چهارشنبه 11 مهر 1386, 22:55 عصر
عذر میخوام اقای راد -- اینکه فرمودید به صورت خودکار توسط پروایدرها انجام میشه...

یعنی الان که ما برای اتصال به دیتابیس از sqlclient و پایگاه sql server استفاده می کنیم ، این تکنیک به صورت اتوماتیک مورد استفاده قرار میگیره ؟؟؟؟

و در ضمن اگه از using استفاده کنیم آیا بازهم کانکشنی که در داخل using تعریف میشه در مخزن pool قرار داده میشه ؟!؟!؟!؟

Behrouz_Rad
چهارشنبه 11 مهر 1386, 23:09 عصر
جواب هر دو سوالت مثبته.

arashkey
دوشنبه 13 اسفند 1386, 20:39 عصر
با تشکر از زحمتی که برای تهیه این مقاله کشیده اید:
آیا در این مورد می توانید بیشتر توضیح دهید؟
با تشکر


واضح گفته شده.
Pooling دارای خواصی هست که قابلیت تنظیم اونها در Connection String وجود داره.
مثلا تعداد Pooling ها و یا زمان Pooling و ...

موفق باشید.
در صورت امکان نام این خاصیت ها را بیان کنید و مقادیر قابل اختیار برای هر یک را نام ببرید ، و یک مثال کلی بیاورید .
با تشکر از مطلب بسیار مفید شما.

Behrouz_Rad
دوشنبه 13 اسفند 1386, 22:23 عصر
از گوگل کمک بگیر.

odiseh
یک شنبه 05 آبان 1387, 14:16 عصر
اولا تشکر از مقالتون
ثانیا اینکه در Connection Pooling نگه می داره، خوب یه جورایی این سربار برای سرور محسوب می شه چون سرور مجبوره که از Resource هاش برای نگهداری Pool های ایجاد شده استفاده کنه.
لطفا در این مورد هم توضیح بدین.

odiseh
یک شنبه 05 آبان 1387, 14:24 عصر
در واقع من سوال قبلیم رو اینطور اصلاح می کنم که آیا Connection ای که Close هستش سربار مصرف می کنه؟

Behrouz_Rad
یک شنبه 05 آبان 1387, 14:35 عصر
خیر. سرباری نداره.

محمدامین شریفی
شنبه 26 اردیبهشت 1388, 12:32 عصر
عذر میخوام اقای راد -- اینکه فرمودید به صورت خودکار توسط پروایدرها انجام میشه...

یعنی الان که ما برای اتصال به دیتابیس از sqlclient و پایگاه sql server استفاده می کنیم ، این تکنیک به صورت اتوماتیک مورد استفاده قرار میگیره ؟؟؟؟

و در ضمن اگه از using استفاده کنیم آیا بازهم کانکشنی که در داخل using تعریف میشه در مخزن pool قرار داده میشه ؟!؟!؟!؟
و همچنین coonection string رو در web.config یا app.cofig تعریف کنیم،از روش pooling استفاده کرده ایم.همین؟

Behrouz_Rad
شنبه 26 اردیبهشت 1388, 14:20 عصر
و همچنین coonection string رو در web.config یا app.cofig تعریف کنیم،از روش pooling استفاده کرده ایم.همین؟

مهم اینه که Connection String در هر درخواست یکی باشه. Web.Config یا App.Config این مورد رو تضمین می کنند.

موفق باشید.

Mostafa_Dindar
شنبه 07 آذر 1388, 10:13 صبح
دوستان در صورتي كه با SqlServer كار ميكنيد پيشنهاد ميكنيم ضمن اين كه ConnectionُString رو هميشه از WebConfig بخونيد از فضاي نام Microsoft.ApplicationBlocks.Data استفاده كنيد .
همچنين بجاي ارسال Connection به متدهاي اين فضاي نام بهتر هست كه ConnectionString رو ارسال كنيد تا ديگه نگران Close و Pool كردن همچنين نگراني در مورد Performance نداشته باشيد.

mehrzad_ali
شنبه 18 خرداد 1392, 19:38 عصر
در LINQToSql هم باید از Connection Pooling استفاده کنیم یا این ویژگی رو داره؟

Mohammadv2
یک شنبه 21 اردیبهشت 1399, 18:06 عصر
پست قدیم هست اما:
یکی از معانی pool‌ گذاشتن کلیه سکه ها داخل یک کاسه جهت شرط بندی است. به این کار میگن یک کاسه کردن و روی هم ریختن. اینجا هم دقیقا به همین معنی کاربرد داره.