# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > مقالات مرتبط با Microsoft .Net Framework >  همه چیز درباره ی Connection Pooling

## Behrouz_Rad

به طور خلاصه، 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

خیلی جالب و مفید بود
از زحمتی که کشیدید سپاسگذارم.
موفق باشید

----------


## aidinwashere

بسیار مشتاق یادگیری آن بودم.
پیروز باشید

----------


## ealireza

بسیار جالب بود 
اگه میشه در مورد مکانیزم ADO.net 2 هم مقالاتی ارسال کنید

با تشکر 

موفق باشید

----------


## jirjirakk

تشکر جناب راد

----------


## iekrang

مرسی.یه سری از ابهامات برطرف شد.

----------


## Arminizer_88

ممنون.
 خیلی دوست داشتم مطالب کاملی بردارش بخونم.

----------


## bahman.net

مرسی خیلی جالب و مفید بود

----------


## mehdisiavashian

با تشکر از زحمتی که برای تهیه این مقاله کشیده اید:



> اما برنامه نویس می تواند با ایجاد تغییراتی در Connection String، برخی از خواص آن را به دلخواه تغییر دهد.


آیا در این مورد می توانید بیشتر توضیح دهید؟
با تشکر

----------


## Behrouz_Rad

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

موفق باشید.

----------


## mehrdad201

عذر میخوام اقای راد -- اینکه فرمودید به صورت خودکار توسط پروایدرها انجام میشه...

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

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

----------


## Behrouz_Rad

جواب هر دو سوالت مثبته.

----------


## arashkey

> با تشکر از زحمتی که برای تهیه این مقاله کشیده اید:
> آیا در این مورد می توانید بیشتر توضیح دهید؟
> با تشکر





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


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

----------


## Behrouz_Rad

از گوگل کمک بگیر.

----------


## odiseh

اولا تشکر از مقالتون
ثانیا اینکه در Connection Pooling نگه می داره، خوب یه جورایی این سربار برای سرور محسوب می شه چون سرور مجبوره که از Resource هاش برای نگهداری Pool های ایجاد شده استفاده کنه. 
لطفا در این مورد هم توضیح بدین.

----------


## odiseh

در واقع من سوال قبلیم رو اینطور اصلاح می کنم که آیا Connection ای که Close هستش سربار مصرف می کنه؟

----------


## Behrouz_Rad

خیر. سرباری نداره.

----------


## محمدامین شریفی

> عذر میخوام اقای راد -- اینکه فرمودید به صورت خودکار توسط پروایدرها انجام میشه...
> 
> یعنی الان که ما برای اتصال به دیتابیس از sqlclient و پایگاه sql server استفاده می کنیم ، این تکنیک به صورت اتوماتیک مورد استفاده قرار میگیره ؟؟؟؟
> 
> و در ضمن اگه از using استفاده کنیم آیا بازهم کانکشنی که در داخل using تعریف میشه در مخزن pool قرار داده میشه ؟!؟!؟!؟


و همچنین coonection string رو در web.config یا app.cofig تعریف کنیم،از روش pooling استفاده کرده ایم.همین؟

----------


## Behrouz_Rad

> و همچنین coonection string رو در web.config یا app.cofig تعریف کنیم،از روش pooling استفاده کرده ایم.همین؟


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

موفق باشید.

----------


## Mostafa_Dindar

دوستان در صورتي كه با SqlServer كار ميكنيد پيشنهاد ميكنيم ضمن اين كه ConnectionُString رو هميشه از WebConfig بخونيد از فضاي نام Microsoft.ApplicationBlocks.Data  استفاده كنيد . 
همچنين بجاي ارسال Connection  به متدهاي اين فضاي نام بهتر هست كه ConnectionString رو ارسال كنيد تا ديگه نگران Close و Pool كردن همچنين نگراني در مورد Performance نداشته باشيد.

----------


## mehrzad_ali

در LINQToSql هم باید از Connection Pooling استفاده کنیم یا این ویژگی رو داره؟

----------


## Mohammadv2

پست قدیم هست اما:
یکی از معانی pool‌ گذاشتن کلیه سکه ها داخل یک کاسه جهت شرط بندی است. به این کار میگن یک کاسه کردن و روی هم ریختن. اینجا هم دقیقا به همین معنی کاربرد داره.

----------

