View Full Version : مشکل در محدودیت در یوزرهای فعال
javad3151
شنبه 25 فروردین 1386, 10:14 صبح
سلام یه نرم افزار با دات نت 2 و SQL SERVER 2005 نوشتم که در محیط اینترانت استفاده میشه مشکل اینجاست که بعضی مواقع این خطا رو میده :
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.با اینکه تعداد کاربران هم زیاد نیستند!!چرا این خطا رو میده و چطور میتونم این مشکل رو حل کنم ؟
AminSobati
شنبه 25 فروردین 1386, 10:59 صبح
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1452009&SiteID=1
Behrouz_Rad
شنبه 25 فروردین 1386, 11:04 صبح
همون طور که احتمالا می دونی، SQL Server یکی از DBMS هایی است که از Pooling استفاده می کنه.
زمانی که یک Connection ایجاد می کنی، Pool Manager وجود یک Connection بلااستفاده رو در Pool بررسی می کنه و در صورتی که Connection آزادی پیدا کرد، از اون استفاده می کنه و در صورتی که Connection آزادی رو در Pool پیدا نکرد و تمامی Connection ها در حال استفاده بودند، Connection جدیدی ایجاد و اون رو به Pool اضافه می کنه. (به طور پیش فرض 100 کانکشن می تونن در Pool قرار بگیرن)
اگر به شکل صحیح، Connection ها رو نبسته باشی، مرتبا به آیتم های درون Pool اضافه میشه تا زمانی که از میزان مجاز فراتر رفت، خطایی که شاهد اون بودی رخ میده.
البته در دات نت GC وجود داره که در فواصل زمانی مشخص، آبجکت های بلااستفاده رو حذف می کنه اما هرگز نباید به اون اعتماد کنی و همیشه خودت باید مدیریت ایجاد و تخریب Connection ها رو بر عهده بگیری.
موفق باشید.
javad3151
شنبه 25 فروردین 1386, 21:13 عصر
چطور میشه فهمید که چند تا کانکشن pool شدند؟
وقتی این خطا رو داد،دیتابیس رو با خود SQL Server چک کردم و نشون میداد که 4 کاربر به دیتابیس کانکت شدند!!!
مسئله دیگه اینکه مگه SQL Server با این مقدار ناچیز کم میاره؟؟ چند سال پیش توی یه سایت خوندم که دیتابیس Minolta حدود 3ترابایت هست که 700 کاربر همزمان با اون کارمیکنند و دیتابیسش هم SQL Server بود
Behrouz_Rad
شنبه 25 فروردین 1386, 21:53 عصر
چطور میشه فهمید که چند تا کانکشن pool شدند؟
از Performance Monitor استفاده کن.
مسئله دیگه اینکه مگه SQL Server با این مقدار ناچیز کم میاره؟؟ چند سال پیش توی یه سایت خوندم که دیتابیس Minolta حدود 3ترابایت هست که 700 کاربر همزمان با اون کارمیکنند و دیتابیسش هم SQL Server بود
این مسئله ربط چندانی به SQL Server نداره!
مدیریت Connection ها در دات نت بر عهده ی ADO.NET هست که مدیریت Pool رو مستقیما بر عهده میگیره.
این یک قانون هست که تعداد Connection ها به طور پیش فرض در Pool تا 100 واحد می تونه باشه و تو می تونی این میزان رو در Connection String تغییر بدی.
در نهایت، باید بلافاصله پس از اتمام عملیات کار بر روی دیتابیس، کانکشن رو ببندی تا به عنوان یک Connection آزاد در Pool شناخته بشه و مورد استفاده قرار بگیره.
موفق باشید.
AminSobati
شنبه 25 فروردین 1386, 22:06 عصر
چطور میشه فهمید که چند تا کانکشن pool شدند؟
وقتی این خطا رو داد،دیتابیس رو با خود SQL Server چک کردم و نشون میداد که 4 کاربر به دیتابیس کانکت شدند!!!
مسئله دیگه اینکه مگه SQL Server با این مقدار ناچیز کم میاره؟؟ چند سال پیش توی یه سایت خوندم که دیتابیس Minolta حدود 3ترابایت هست که 700 کاربر همزمان با اون کارمیکنند و دیتابیسش هم SQL Server بود
مطلبی که شما خوندین در سایت مایکروسافت در قسمت Switchers (شرکتهایی که از Oracle یا DB2 به SQL Server سوییچ کردند) قید شده که ضمنا 5.5 ترابایت حجم دیتابیس بوده!
حق با شماست، حتی روی ضعیف ترین سخت افزار هم چهار Connection مشکل ساز نخواهد شد و معتقدم مشکل در سمت کلاینت هستش.
برای آزمایش مقدار Time Out رو در Connection String زیاد کنین و نتیجه رو ببینین
AminSobati
شنبه 25 فروردین 1386, 22:06 عصر
همون طور که احتمالا می دونی، SQL Server یکی از DBMS هایی است که از Pooling استفاده می کنه.
این Pooling رو SQL Server انجام نمیده، بلکه سمت کلاینت توسط خود ADO کنترل میشه. SQL Server عمل Pooling رو روی Threadها انجام میده.
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.VisualStudio.v80.en/WD_ADONET/html/7e51d44e-7c4e-4040-9332-f0190fe36f07.htm
Behrouz_Rad
شنبه 25 فروردین 1386, 23:21 عصر
حق با شماست، حتی روی ضعیف ترین سخت افزار هم چهار Connection مشکل ساز نخواهد شد و معتقدم مشکل در سمت کلاینت هستش.
کلاینت در این قسمت نمی تونه دخالتی داشته باشه.
برای آزمایش مقدار Time Out رو در Connection String زیاد کنین و نتیجه رو ببینین
افزایش میزان Connection Timeout تا زمانی که Connection آزادی در Pool وجود نداره، تاثیری در رفع مشکل نداره...
در ADO.NET 2.0، دو متد ClearAllPools و ClearPool برای خالی کردن Pool استفاده میشن.
موفق باشید.
Behrouz_Rad
شنبه 25 فروردین 1386, 23:36 عصر
این Pooling رو SQL Server انجام نمیده، بلکه سمت کلاینت توسط خود ADO کنترل میشه. SQL Server عمل Pooling رو روی Threadها انجام میده.
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.VisualStudio.v80.en/WD_ADONET/html/7e51d44e-7c4e-4040-9332-f0190fe36f07.htm
منظورم همونه دیگه برادر ثباتی...
همان بحث 255 کانکشن پیش فرض که اگر بیش از این مقدار شد از Thread Pooling استفاده میشه.:لبخندساده:
در پست شماره ی 5 عرض کردم که:
این مسئله ربط چندانی به SQL Server نداره!
مدیریت Connection ها در دات نت بر عهده ی ADO.NET هست که مدیریت Pool رو مستقیما بر عهده میگیره.
مرسی.
AminSobati
یک شنبه 26 فروردین 1386, 13:48 عصر
افزایش میزان Connection Timeout تا زمانی که Connection آزادی در Pool وجود نداره، تاثیری در رفع مشکل نداره.
زمانی که ADO موفق نشه در زمان معین Connection رو باز کنه، پیغام Time Out میده. در موارد زیادی دیده شده که جزئیات پیغام با اصل دلیل خطایی که رخ داده مرتبط نیست، چون ADO موفق نشده دقیقا نوع اشکال رو شناسایی کنه و پیغامی که به احتمال بیشتر بتونه دلیل مناسب باشه نمایش میده.
و از اونجائیکه اصولا برنامه نویسها در هنگام برخورد به مشکل، از Try کردن حتی کوچکترین راه حل هم فروگذار نمیکنند، لذا توصیه میشه تغییر مقدار Time Out در Connection String هم آزمایش بشه!
Behrouz_Rad
یک شنبه 26 فروردین 1386, 14:38 عصر
در موارد زیادی دیده شده که جزئیات پیغام با اصل دلیل خطایی که رخ داده مرتبط نیست،
درسته! اما نه در همه ی موارد؛ که این مورد یکی از اون مواردی هست که جزء خطاهای واضح هست...
زمانی که ADO موفق نشه در زمان معین Connection رو باز کنه، پیغام Time Out میده.
در زمان پر بودن Pool، این ADO.NET هست که با بررسی میزان آیتم های موجود در Pool و پی بردن به این موضوع که فرضا Pool پر هست، درخواست ایجاد Connection جدید رو Reject می کنه.
زمان Timeout به طور پیش فرض 30 ثانیه است که زمان خوبی برای برقراری ارتباط محسوب میشه. با افزایش این زمان، در حقیقت SQL Provider زمان بیشتری رو در انتظار آزاد شدن یکی از کانکشن های درون Pool صرف می کنه که چون در این حالت، نقش اصلی رو در آزاد سازی منابع استفاده شده، GC بر عهده داره و زمان عملکرد GC به هیچ وجه قابل پیش بینی نیست، در نتیجه افزایش Timeout، تنها معطلی بیشتری رو در روال پاسخگویی در پی خواهد داشت.
اصولا این سوال باید در بخش زبان برنامه نویسی مربوطه مطرح میشد نه این بخش!
موفق باشید.:لبخندساده:
AminSobati
یک شنبه 26 فروردین 1386, 15:29 عصر
بهروز جان اگر همیشه همه چیز دقیقا طبق همون چیزی که در MSDN نوشته پیش بره، هیچ وقت نباید باگ پیدا کنیم!
Behrouz_Rad
یک شنبه 26 فروردین 1386, 16:18 عصر
بهروز جان اگر همیشه همه چیز دقیقا طبق همون چیزی که در MSDN نوشته پیش بره، هیچ وقت نباید باگ پیدا کنیم!
Special Thanks For Your Accompaniment:لبخندساده:
payam_skandari
پنج شنبه 30 فروردین 1386, 12:27 عصر
اگر به شکل صحیح، Connection ها رو نبسته باشی، مرتبا به آیتم های درون Pool اضافه میشه تا زمانی که از میزان مجاز فراتر رفت، خطایی که شاهد اون بودی رخ میده.
البته در دات نت GC وجود داره که در فواصل زمانی مشخص، آبجکت های بلااستفاده رو حذف می کنه اما هرگز نباید به اون اعتماد کنی و همیشه خودت باید مدیریت ایجاد و تخریب Connection ها رو بر عهده بگیری.
موفق باشید.
استاد من یه سوال در این مورد تخریب کانکشن دارم.
اگر instance کانکشن رو موقع ساخت توی c# از دستور using استفاده کنیم عمل تخریب و خالی شدن pool از اون کانکشن , به درستی انجام میشه یا نه باید کار دیگه ای واسه ی خالی کردن pool و تخریب کانکشن باید انجام داد؟
ممنون میشم توضیح بدین.
Behrouz_Rad
پنج شنبه 30 فروردین 1386, 15:54 عصر
اگر instance کانکشن رو موقع ساخت توی c# از دستور using استفاده کنیم عمل تخریب و خالی شدن pool از اون کانکشن , به درستی انجام میشه یا نه
بله.........
javad3151
پنج شنبه 30 فروردین 1386, 19:50 عصر
من کل Connection ها رو چک کردم، ولی نشد
Time out رو هم 60 کردم ، ولی نشد
اصلا گیریم که pool ظرفیتش پر شده باشه(شاید 1000 کاربر بخواهند همزمان سایت رو ببینند) ، چرا برنامه یه کانکشن دیگه به SQL Server نمیزنه؟؟
چطور میشه pooling رو غیر فعال کرد؟ به نظر شما کار درستیه(فکر کنم خود SQL Server 2005 این کار رو انجام میده)
TuneUp
پنج شنبه 30 فروردین 1386, 20:25 عصر
من کل Connection ها رو چک کردم، ولی نشد
Time out رو هم 60 کردم ، ولی نشد
اصلا گیریم که pool ظرفیتش پر شده باشه(شاید 1000 کاربر بخواهند همزمان سایت رو ببینند) ، چرا برنامه یه کانکشن دیگه به SQL Server نمیزنه؟؟
چطور میشه pooling رو غیر فعال کرد؟ به نظر شما کار درستیه(فکر کنم خود SQL Server 2005 این کار رو انجام میده)
شما بعد از اینکه کانکشن رو باز کردید و اطلاعات رو خوندید بلافاصله کانکشن رو میبندید؟
برای غیر فعال کردن pooling که اصلا" پیشنهاد نمیشه میتونی در کانکشن استرینگتون اون رو غیر فعال کنید.
"Server=.;Database=Northwind;Integrated Security=True;Pooling=False"
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.