PDA

View Full Version : خطا در ارتباط با دیتابیس برای درخواست های همزمان



leila.net
چهارشنبه 25 شهریور 1394, 11:42 صبح
سلام دوستان

من توی برنامم از Parrallel.ForEach توی سی شارپ استفاده می کنم که همزمان دستورات Update , Select های زیادی رو اجرا می کنه ولی خب دارم مکررا با خطای

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.

مواجه می شم . با اینکه تمام کانکشن هام رو بعد از اجرا می بندم و از connection pool حذف می کنم ! و البته max pool size رو هم توی connection string اضافه کردم و مقدارش رو هم 2000 قرار دادم!

از دوستان کسی راه حلی سراغ داره برا این خطا ؟

leila.net
پنج شنبه 26 شهریور 1394, 09:47 صبح
و توضیحات کامل :

ضمن تشکر از توجه و راهنمایی دوستان ، بنده سناریو رو توضیح میدم و مشکلی که الان بهش برخوردم رو و بعد از دوستان تقاضا دارم در مورد رفع مشکل راهنمایی بفرمایند :



من با c# و asp.net mvc کار می کنم.


خب در نظر بگیرین یک حلقه foreach دارم با حدود 1500 ایتم که داخل هر حلقه چهار ارتباط با دیتابیس دارم. چهار ارتباط با دیتابیسم شامل دو insert , update که با sp انجام میشه و یک دستور Select که با توجه به item لیستم ، top حدود 10 تا 100 رو از یکی از جدول هام انتخاب می کنه و البته مابین این ها یکسری پرداش هایی صورت میگیره و نهایتا bulkInsert انجام میدم که برا اینکار هم از table type استفاده کردم .


تا اینجا مشکلی پیش نمی اومد و برنامه بخوبی کار می کرد به غیر از یک مورد که زمان اجرا خیلی طولانی بود!


خب با توجه به اینکه زمان اجرای سریال این فرایند زیاد بود تصمیم گرفته شد بجای foreach ، از Pararllel.ForEach استفاده کنیم ولی خب الان به timeout از سمت Sql Server مواجه میشیم !
البته در جزئیات خطا این رو مشاهده می کنیم


connection pool reached max size


هر چند pool max size رو هم افزایش میدم ولی ظاهرا اعمال نمیشه زمان اجرا و به این ترتیب خطا همچنان پیش میاد!


البته این رو باید اضافه کنم که تمام دستورات داخل حلقه اصولا همزمان اجرا نمی شن چون بسته به item ، پردازش های متفاوتی داخل حلقه انجام میگیره.


activity monitor رو هم بررسی کردم و حداکثر تا 280 فرآیند و ارتباط با دیتابیس رو دیدم که البته اکثر اون ها هم تو وضعیت awaiting command بودن .




ممنون میشم در مورد خطاهای بوجود آمده و نحوه رفع اون راهنمایی کنین .

Felony
چهارشنبه 01 مهر 1394, 10:42 صبح
با اینکه تمام کانکشن هام رو بعد از اجرا می بندم و از connection pool حذف می کنم !
به چه صورت این کارو انجام میدید ؟ (نمونه کد)

عملیات هایی که در حلقه انجام میدید چی هست ؟ وابستگی این عملیات ها به هم چطور هست ؟
استفاده اینچنینی Pararllel.ForEach حتی اگر مشکل کانکشن شما رفع بشع باز هم مشکل ساز خواهد بود ، با چیزی که شما توضیح دادید همه چیز را واگذار کردید به Pararllel.ForEach و هزار تا بلا داخلش سر دیتابیس در میارید ، بحث های همزمانی ، synchronaization ، اشتراک منابع ، race condition در بحث های شما جایی نداشته !

بهتره یه نمونه کد تمیز و جمع جور قرار بدید تا بررسی بشه .