PDA

View Full Version : مبتدی: مصرف بیش از حد منابع سیستم در ارتباط با دیتابیس



alimooghashang
پنج شنبه 09 شهریور 1391, 13:00 عصر
سلام
من یه برنامه نوشتم که داخلش از DataSet برای اتصال به دیتابیسم استفاده کردم
و یک DataSet.xsd داخل برنامه ساختم و داخل اون تیبل های دیتابیسم رو اضافه کردم
و هر جدولی یک سری تابع insert update delete و select بصورت پیشفرض ساخته و من از اونا استفاده میکنم!

منتها الان وقتی داخل یک تایمر میخوام اطلاعاتی رو داخل دیتابیس چک کنم و وارد کنم و حذف کنم cpu usage میره روی 100 درصد و تقریبا برنامه هنگ میکنه
آیا روش من اشتباهه؟

دیتابیس من هم sql server 2008 هست
ممنون

mousa1992
پنج شنبه 09 شهریور 1391, 13:15 عصر
تایمر هر چند مدت یک بار به دیتابیس سرمیزنه ؟؟
و ایا بهتر نیست از background ها استفاده کنی

alimooghashang
پنج شنبه 09 شهریور 1391, 13:16 عصر
تایمر هر چند مدت یک بار به دیتابیس سرمیزنه ؟؟
و ایا بهتر نیست از background ها استفاده کنی

2 ثانیه یک بار
در حد 25 کوئری ارسال میکنه!
سوال من اینه که آیا کاری که من کردم و از dataset استفاده کردم کار درستی هست یا نه؟
روش اصولیش چیه؟

irantopweb
پنج شنبه 09 شهریور 1391, 13:34 عصر
کوئر ی ها تو بزار ببینیم

alitavakoli
پنج شنبه 09 شهریور 1391, 13:43 عصر
روش اصولی برای این کار از استفاده از ENTITY FRAMEWORK هست و مورد دیگه استفاده از تایمر برای انجام این کار درست نیست تایمر چک نمیکنه که آیا این چند درخواستی که شما به دیتا بیس ارسال کردین انجام شده یا نه.
برای اینکار میتونید از BACKGROUNDWORKER استفاده کنید که کارهاتون رو منتقل کنه به یک ترد دیگه.

alimooghashang
پنج شنبه 09 شهریور 1391, 14:59 عصر
روش اصولی برای این کار از استفاده از ENTITY FRAMEWORK هست و مورد دیگه استفاده از تایمر برای انجام این کار درست نیست تایمر چک نمیکنه که آیا این چند درخواستی که شما به دیتا بیس ارسال کردین انجام شده یا نه.
برای اینکار میتونید از BACKGROUNDWORKER استفاده کنید که کارهاتون رو منتقل کنه به یک ترد دیگه.

ممنون میشه یه نمونه رو مثال بزنید؟
یا یه سمپل کد ساده بدید که از اون الهام بگیرم
ممنون

alimooghashang
پنج شنبه 09 شهریور 1391, 15:23 عصر
در ضمن من اگه الان بخوام به entity framework کوچ کنم ، پروژه ام چقدر باید تغییر کنه؟ با توجه به اینکه از dataset استفاده کردم!

alitavakoli
پنج شنبه 09 شهریور 1391, 15:24 عصر
به فرض مثال میخوایم تعداد زیادی رکورد رو به صورت اتوماتیک وارد دیتا بیس کنیم

foreach(item in AllData)
{
using (StorageEntities context = new StorageEntities())
{
//Insert

_CustomerProductTbl = new CustomerProductTbl();
_CustomerProductTbl.CustomerId = AllData ._CustomerId;
_CustomerProductTbl.CustomerProductDateFa = AllData.datefa;
ClsDataBase.Database.AddToCustomerProductTbls(_Cus tomerProductTbl);
}
ClsDataBase.Database.SaveChanges();
}
}

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

alitavakoli
پنج شنبه 09 شهریور 1391, 15:26 عصر
برای کوچ به ef زمان خیلی کمی میبره
فقط کافیه دیتا بیستون رو مدل کنید:
و دستورات linq رو یاد بگیرید

alimooghashang
پنج شنبه 09 شهریور 1391, 15:32 عصر
منظورم از مثال BACKGROUNDWORKER بود!

tooraj_azizi_1035
پنج شنبه 09 شهریور 1391, 19:04 عصر
اصلاً شما به چه هدفی تایمر استفاده می کنی؟
اگه قصدت اینه که تغییرات سایر کاربران رو به برنامه منعکس کنی اون هم در بازه دو ثانیه بسیار کار اشتباهی می کنی.
شما باید از Service Broker و SqlDependency برای رفرش اطلاعات در سمت کلاینت استفاده کنی. وقتی اطلاعاتی در بانک ثبت میشه اتوماتیک به برنامه سیگنال می ده.

با عنوان رفرش دیتاگرید سرچ کن.

alimooghashang
دوشنبه 01 آبان 1391, 18:21 عصر
ممنون
برنامه ی نمونه اش هم هست که ببینم چطوری کار میکنه؟
چون کلاینت های من 400 عدده و دارن همزمان دیتای جدید میفرستن
با این سیگنال ها مشکلی برای برامه پیش نمیاد؟