دسته بندی ها
12:51 1401/06/21

خطای Connection attempt failed در Load میلیونها رکورد از دیتابیس توسط EF

مشخصات سوال کننده :
کاربر : mshosseini     امتیاز کاربر : 33     رتبه کاربر : 23
دسته بندی : Asp.net Core Entity Framework

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 2874
3 نظر
saedbfd : کدی که برای فراخوانی اطلاعات از دیتابیس نوشتید هم قرار بدید

امتیاز کاربر : 1664   رتبه کاربر : 1   تاریخ ثبت : 12:57 1401/06/21
mshosseini : در انتهای سوال اضافه شد ، ممنون از پاسخ دهی و پشتیبانی سریعتون

امتیاز کاربر : 33   رتبه کاربر : 23   تاریخ ثبت : 01:02 1401/06/21
yasasemani : اگه هدف فقط نمایش اطلاعاته چرا از stored procedure استفاده نمی کنید سرعت خوانش اطلاعات از این طریق خیلی بالاتر میره

امتیاز کاربر : 6   رتبه کاربر : 80   تاریخ ثبت : 03:34 1401/06/21
ادامه نظرات ...
هوش مصنوعی

پاسخ هوش مصنوعی

برای مدیریت کار با دیتابیس هایی که میلیون ها رکورد دارند، پیشنهاد می کنم از روش های زیر استفاده کنید:

1. **استفاده از Paging**: برای کاهش حجم داده ای که در یک بار خوانده می شود، می توانید از Paging استفاده کنید. این کار به شما اجازه می دهد تا فقط تعدادی از رکوردها را در هر بار بارگذاری کنید.

int pageNumber = 1;
int pageSize = 100; // تعداد رکوردهای در هر درخواست
List<Tbl_Data_Sim> sim09 = await _context._data_SimUW
    .Where(a => a.Mobile == mobile)
    .Skip((pageNumber - 1) * pageSize)
    .Take(pageSize)
    .ToListAsync();

2. **استفاده از Async/Await**: استفاده درست از async و await می تواند به بهبود عملکرد و کاهش احتمال بروز خطاهای مرتبط با زمان (timeout) کمک کند. در کد بالا، `ToListAsync()` به صورت غیر همزمان کار می کند.

3. **افزایش Timeout**: می توانید زمان timeout اتصال به دیتابیس را افزایش دهید. این کار به شما اجازه می دهد تا زمان بیشتری برای پاسخگویی دیتابیس داشته باشید.

optionsBuilder.UseSqlServer("your_connection_string;Connection Timeout=120;");

4. **بررسی سرور دیتابیس**: اطمینان حاصل کنید که سرور دیتابیس به درستی پیکربندی شده و می تواند بار سنگین را تحمل کند. این امر شامل بهینه سازی ایندکس ها و بررسی قابلیت های سرور برای مدیریت میزان بالای ترافیک است.

5. **بهبود کویری ها**: مطمین شوید که کویری های شما بهینه سازی شده اند. استفاده از ایندکس ها و حذف جستجوهای غیرضروری می تواند به کاهش زمان پاسخ دیتابیس کمک کند.

با استفاده از این روش ها، انشاءالله بتوانید با مشکل timeout در حین بارگذاری رکوردها از دیتابیس مقابله کنید.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : hamid_b 17:22 1401/06/21

استفاده از متد Take برای واکشی محدود اطلاعات در انتیتی فریم ورک

اما در مورد سوال شما، ببینید واکشی حدود 10 میلیون رکورد قطعا فشار زیادی به سرور و دیتابیس میاره و منابع سیستمی زیادی رو مصرف میکنه که باعث Crash کردن سیستم یا hang کردن سیستم به صورت طولانی میشه. اگر شما قصد دارید اطلاعاتتون رو نمایش بدید قطعا کاربر نیاز نداره به طور همزمان 10 میلیون رکورد رو ببینه.

بنابراین می تونید توسط دستور زیر مثلا 1000 رکورد آخر رو واکشی کنید و اگر کاربر نیاز داشت اطلاعات دیگه ای رو ببینه براش قابلیت جستجو بذارید و در هر بار جستجو هم نهایتا 1000 رکورد رو واکشی کنید.

List<Tbl_Data_Sim> sim09 = _context._data_SimUW.Get(a => a.Mobile == mobile, null, "").ToList().Take(1000);

 

استفاده از برنامه نویسی ناهمزمان Async

اگر فکر می کنید که عملیاتی دارید که ممکنه بار زیادی روی سرور بذاره و یا اطلاعات زیادی میخواید واکشی کنید برای جلوگیری از ایجاد مکث یا هنگ در سیستم می تونید تابع خودتون رو به صورت ناهمزمان تعریف کنید:

public async Task<IActionResult> Index()
{
   var myVar = _context.TableName.ToListAsync();
}

کد بالا به صورت نمونه نوشته شده. شما هم کافیه کدهاتون رو با توجه به دستورات بالا تغییر بدید.

 

به نظر خودم با توجه به اینکه می فرمایید حدود 10 میلیون رکورد دارید استفاده از Take بهتر باشه.

ضمنا بهتره سوالتون رو با جزییات کامل بپرسید و به نرم افزار یا آموزش دیگه ای ارجاع ندید چون ممکنه بازدیدکنندگان سوال شما اون آموزش رو ندیده باشن

ویرایش شده در دوشنبه 21 شهریور 1401 ساعت 17:22:58
به این پاسخ امتیاز بدهید    1
امتیاز: 518 رتبه: 4
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود