PDA

View Full Version : سوال: چطور فشار روی برنامه رو کم کنم ؟ (خیلی مهمه خواهشا جواب بدید)



EnKamran
چهارشنبه 23 فروردین 1391, 16:49 عصر
سلام عزیزان. دوستان این مسئله برام حیاتی لطفا ببینید چطور میشه ؟ :
ببینید وقتی سایت معمولی درست می کنیم خوب مشکلی نداره اما وقتی سایت ما میشه پر بازدید اینجا مسئله پیش میاد :
مشکلی که برای من پیش اومده اینه که وقتی چند نفر یک خبر رو با هم باز می کنن اررور میده که یک transaction در حال اجراست و دیگه نمیشه اجرا کرد و کلا فکر میکنم منظورش اینه که جدول مورد نظر داره کاری انجام میده و نمیشه.
من توی نمایش خبر 2 کار انجام میدم : 1 - نمایش خبر 2- آپدیت همون رکوردی که داره فراخوانی میشه (یک فیلدش مال تعداد بازدیده که تو لود صفحه میاد و +1 میکنه)
حالا میشه بگید مشکل کجاست و چکار باید کنم ؟
یک سوال دیگه اینکه دیتابیس روی لوکال نیست و آی پی دادن می خوام ببینم اینکه لوکال نیست و آی پی داره تاثیری روی سرعت داره ؟

mirahsani
چهارشنبه 23 فروردین 1391, 16:56 عصر
باید دقت کنی چه دستوراتی در دیتا بیس و به چه صورتی استفاده می کنی. از StoreProcedure استفاده کن و تداخل هارو برطرف کن.

mirahsani
چهارشنبه 23 فروردین 1391, 16:57 عصر
آی پی درسته سرعت رو بصورت نا محسوس پایین میاره ولی اررور نمی ده!!!

EnKamran
چهارشنبه 23 فروردین 1391, 17:04 عصر
من با EF کار میکنم و 3 لایه کار کردم، یعنی با استورد پروسیجر درست میشه ؟ آخه خوب مشکل با کوئری نیس که مشکل از اینه که وقتی داره واکشی میکنه در همون لحظه میاد و همون رکورد رو آپدیت میکنه. چند جا که سرچ کردم بحث لاک کردن جدول بود اما همه گنگ گفته بودن و مثال بدرد بخورب ندیدم.

mahan.2002
چهارشنبه 23 فروردین 1391, 18:11 عصر
سلام
بنظرم سروری که دارید کار میکنید باهاش مشکل داره... میشه بگید چنتا بازدید یعنی بیش از 100 تا یا هزار تا ... فکر نمیکنم یک خبر ... حجم بالای اطلاعات باشه...
در ضمن اگر فکر میکنید از کوئری هم هست می تونید کوئری های وا کشی تون رو بزارید ... دوستان چک کنند .. بهینه ترین کوئری رو استفاده کنید..

EnKamran
چهارشنبه 23 فروردین 1391, 18:14 عصر
خیر روزی 1000 تا هم نمیشه فعلا اما همین هم داره اررور میده خوب، از ایران هاست گرفتیم هاست رو هاست اونا مطمعنه
ببینید این مال واکشی هست که توی BLL نوشتم :
(چون یک اررور هم مبنی بر اینکه کانکشن بسته شده هم میداد مجبور شدم اون شرط اول رو هم بذارم )
public TBL_Contents Details(int contentid)
{
if(DataContext.Context.Connection.State.ToString() == "Closed")
{
var content =
(from c in DataContext.Context.TBL_Contents
where c.ContentID == contentid
select c)
.FirstOrDefault();
return content;
}
else
{
Thread.Sleep(1000);
var content =
(from c in DataContext.Context.TBL_Contents
where c.ContentID == contentid
select c)
.FirstOrDefault();
return content;
}



اینم مال آپدیت کردنشه که یک شماره به بازدید ها اضافه کنه :

public void AddView(int contentid)
{
if (DataContext.Context.Connection.State.ToString() == "Closed")
{
var content =
(from c in DataContext.Context.TBL_Contents where c.ContentID == contentid select c).FirstOrDefault();

if (contentid != null)
{
content.ContentView += 1;
DataContext.Context.SaveChanges();
}
}
else
{
Thread.Sleep(1000);
var content =
(from c in DataContext.Context.TBL_Contents where c.ContentID == contentid select c).FirstOrDefault();

if (contentid != null)
{
content.ContentView += 1;
DataContext.Context.SaveChanges();
}
}
}

C#.net
چهارشنبه 23 فروردین 1391, 18:50 عصر
دوست عزیز این یک ثانیه تاخیر رو برای چی گذاشتید؟

Thread.Sleep(1000);

EnKamran
چهارشنبه 23 فروردین 1391, 18:59 عصر
واسه اینکه اگه کتنکشن بسته بود یک ثانیه دیگه تلاش کنه تا باز بشه (فک کردم کانکشن با یکی دیگه باز شده و اینکار از خطا دادن جلوگیری کنه) اشتباهه ؟

C#.net
چهارشنبه 23 فروردین 1391, 19:08 عصر
واسه اینکه اگه کتنکشن بسته بود یک ثانیه دیگه تلاش کنه تا باز بشه (فک کردم کانکشن با یکی دیگه باز شده و اینکار از خطا دادن جلوگیری کنه) اشتباهه ؟
بله! مشکل کد شما دقیقا همینه! این کار رو انجام بدید:



public void AddView(int contentid)
{
if (DataContext.Context.Connection.State != ConnectionState.Open)
{
DataContext.Context.Connection.Open();
}


var content =
(from c in DataContext.Context.TBL_Contents where c.ContentID == contentid select c).FirstOrDefault();

if (contentid != null)
{
content.ContentView += 1;
DataContext.Context.SaveChanges();
}
}



طبیعتا برای هر دوتا متد این کار رو انجام می دید.
در ضمن یه سوال، DataContext رو کجا و به چه صورت تعریف کردید؟

EnKamran
چهارشنبه 23 فروردین 1391, 19:53 عصر
یک فایل کلاس توی پروژه DAL درست کردم( همون پروژه که مدل رو توش ایمپورت کردم) استمش DataContext هست و کانتکستم رو اونجا تعریف کردم به صورت پابلیک و استاتیک تا همه جا دسترسی داشته باشم.

C#.net
چهارشنبه 23 فروردین 1391, 21:14 عصر
یک فایل کلاس توی پروژه DAL درست کردم( همون پروژه که مدل رو توش ایمپورت کردم) استمش DataContext هست و کانتکستم رو اونجا تعریف کردم به صورت پابلیک و استاتیک تا همه جا دسترسی داشته باشم.
ببینید دوست عزیز، هر بار که شما عملیاتی رو روی DataContext انجام می دید این شی رو سنگین و سنگین تر می کنید و چون در برنامتون فقط یه کپی از اون وجود داره قطعا بیش از این دچار مشکل خواهید شد و دور از انتظار نیست که برنامتون به طور مکرر نیاز به IIS Reset داشته باشه...

راه حل
از اونجا که DataContext ذاتا آبجکت سنگینی نیست و طوری طراحی شده که برای استفاده کوتاه مدت مناسب باشه، به نظر من هر بار یه نمونه جدید از این کلاس رو بسازید، یعنی:


using (var context = new YourDBEntities())
{
//
// TODO: کدهای واکشی داده ها رو اینجا بنویسید
// و نگران هیچ چیز از جمله باز بودن کانکشن و Concurrency نباشید
//
}


البته روش های دیگه ای هم وجود داره ولی به علت سادگی و کارایی روش فوق، همین روش رو به شما توصیه می کنم

برای مطالعه بیشتر، روش هایی مثل:

- ایجاد Context به ازای هر Request
- ایجاد Context در کانستراکتور کلاس
- اشتراک Context بوسیله pass کردن در متدها
- و ...

EnKamran
چهارشنبه 23 فروردین 1391, 21:31 عصر
دلم نیومد فقط با دکمه تشکر کنم، واقعا ممنون تفاوتشون کاملا مشهوده سرعت لود خیلی بالاتر اومد. واقعا ممنون دوست من

d_derakhshani
پنج شنبه 24 فروردین 1391, 00:16 صبح
دوست عزیز DataContext رو Global, static تعریف نکن. این یکی از اشتباهاتیه که اکثر برنامه نویس ها می کنن. این کار به شدت سرعت شما رو پایین میاره هیچ، مشکل شما از همین جا ناشی میشه. چون یک datacontext داری در نتیجه هر datacontext فقط می تونه یک transactionv در آن واحد انجام بده. حالا اگه یک کاربر در حال اجرا کوئری ویرایش باشه و در همون لحظه کاربر بعدی برای عمل ویرایش برسه مشکل Transaction پیش میاد. datacontext ها رو در سطح تابع تعریف کنیدو اگه در سطح کلاس تعریف می کنید دقت کنید که static نباشه.
برای اطلاعات بیشتر در مورد نحوه درست استفاده و موثر از EF به منابع مربوطه در همین زمینه مراجعه کنید

EnKamran
پنج شنبه 24 فروردین 1391, 00:19 صبح
واقعا مفید بود ممنون. دوست گلم میشه شما منبع رو معرفی کنید ؟ راستش منبع خیلی زیاده اما گیج میشه آدم نمیدونم کدوم درسته و کدوم درست تر، شما یک منبع معرفی کنید که اصولی گفته باشه. ممنون

d_derakhshani
پنج شنبه 24 فروردین 1391, 00:33 صبح
Oreilly Programming Entity Framework: chapter 20
Appress Pro Entity Framework.4.0: chapter: performance tuning and exception handling
Apress.Entity Framework 4.0 Recipes: chapter: Improving performance
Oraeilly از نظر من خوب و بیشتر توضیح میده.

00empty00
جمعه 25 فروردین 1391, 14:13 عصر
از اونجا که DataContext ذاتا آبجکت سنگینی نیست و طوری طراحی شده که برای استفاده کوتاه مدت مناسب باشه، به نظر من هر بار یه نمونه جدید از این کلاس رو بسازید، یعنی:

using (var context = new YourDBEntities())
{
//
// TODO: کدهای واکشی داده ها رو اینجا بنویسید
// و نگران هیچ چیز از جمله باز بودن کانکشن و Concurrency نباشید
//
}
ممنون بایت توضیحتون....
دوست عزیز یعنی من بجای اینکه بیام تو
{
public class DataContext
{
public static NewsDBEntities Context = new NewsDBEntities();
}
}
بیام و هر بار
using (var context = new YourDBEntities())
{
//
// TODO: کدهای واکشی داده ها رو اینجا بنویسید
// و نگران هیچ چیز از جمله باز بودن کانکشن و Concurrency نباشید
//
}
بیارم من این کارو کردم اما context منو نمیشناسه مشکل کارم کجاس؟! نکنه کدو جای مورد نظرش نمیذارم:خجالت:کجا بذارمش:خجالت:

EnKamran
جمعه 25 فروردین 1391, 14:17 عصر
بیارم من این کارو کردم اما context منو نمیشناسه مشکل کارم کجاس؟! نکنه کدو جای مورد نظرش نمیذارم:خجالت:کجا بذارمش:خجالت:
using (var context = new NewsDBEntities())
{
//
// TODO: کدهای واکشی داده ها رو اینجا بنویسید
// و نگران هیچ چیز از جمله باز بودن کانکشن و Concurrency نباشید
//
}
به این صورت باید بنویسی، همینطوری نوشتی ؟

00empty00
جمعه 25 فروردین 1391, 14:33 عصر
به این صورت باید بنویسی، همینطوری نوشتی ؟
آره همینجوری نوشتم...من که میخوام با روال کلیک اطلاعاتم بره تو پایگام بین این تیکه کد قراره کدهای واکشیم قرار بگیره من تو روال کلیکم اینو بیارم...درسته؟یا اشتباه متوجه شدم؟
احیانا با using که مدلمو معرفی میکنه که کاری نداریم؟یعنی باید باشه.درسته؟

using News.Model;

EnKamran
جمعه 25 فروردین 1391, 14:35 عصر
درسته :-؟ شما لطف کنید کدهاتون رو قرار بدید تا دوستان و بنده بهتر بتونیم کمک کنیم

00empty00
جمعه 25 فروردین 1391, 14:57 عصر
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using News_Site.Model;


namespace News_Site
{


public partial class Ozviat : System.Web.UI.Page
{


protected void Page_Load(object sender, EventArgs e)
{

}

protected void btn_save_Click(object sender, EventArgs e)
{
using (var context = new NewsDBEntities())

{

if (Page.IsValid)
{

DataContext.Context.Tbl_Ozviat.AddObject(new Tbl_Ozviat()
{
Name = Txt_Name.Text,
Family = Txt_Family.Text,
Email = Txt_Email.Text,
U_Id = Txt_Uid.Text,
Pwd = Txt_Pwd.Text,
MemberRole = "user"

});

DataContext.Context.SaveChanges();
Lbl_Taeid.Visible = true;
Txt_Name.Text = string.Empty;
Txt_Family.Text = string.Empty;
Txt_Email.Text = string.Empty;
Txt_Uid.Text = string.Empty;
Txt_Pwd.Text = string.Empty;
Txt_R_Pwd.Text = string.Empty;

Txt_Name.Text = " ";
Txt_Family.Text = " ";
Txt_Email.Text = " ";
Txt_Uid.Text = " ";
}

}
}
}
}

میگه 'News_Site.Model.DataContext' does not contain a definition for 'context' کجای کارم اشتباس؟چه کدوی رو پسو پیش گذاشتم که داره اینو میگه:خجالت::لبخند:

C#.net
جمعه 25 فروردین 1391, 15:03 عصر
میگه 'News_Site.Model.DataContext' does not contain a definition for 'context' کجای کارم اشتباس؟چه کدوی رو پسو پیش گذاشتم که داره اینو میگه:خجالت::لبخند:
در خط 32 و 43! به جای DataContext.Context بنویسید context
اون کلاس استاتیک رو هم کلا بردارید از پروژه تا باعث همچین اشتباهاتی دیگه نشه
پیشنهاد می کنم شما که برخلاف خیلی از کاربران این سایت، و به درستی از ORM استفاده می کنید واقعا حیفه کدهاتون رو به این صورت در UI بنویسید، حداقل یه لایه بیزبنس به پروژتون اضافه کنید...

00empty00
جمعه 25 فروردین 1391, 15:16 عصر
در خط 32 و 43! به جای DataContext.Context بنویسید context
اون کلاس استاتیک رو هم کلا بردارید از پروژه تا باعث همچین اشتباهاتی دیگه نشه
ممنون از راهنماییتون دوست عزیز اما حالا تو خط 32 و 43 به tbl_ozviat وsavechange ایراد میگیره

C#.net
جمعه 25 فروردین 1391, 15:37 عصر
چه خطایی دقیقا؟

EnKamran
جمعه 25 فروردین 1391, 15:39 عصر
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using News_Site.Model;


namespace News_Site
{


public partial class Ozviat : System.Web.UI.Page
{


protected void Page_Load(object sender, EventArgs e)
{

}

protected void btn_save_Click(object sender, EventArgs e)
{
using (var context = new NewsDBEntities())

{

if (Page.IsValid)
{

context.Tbl_Ozviat.AddObject(new Tbl_Ozviat()
{
Name = Txt_Name.Text,
Family = Txt_Family.Text,
Email = Txt_Email.Text,
U_Id = Txt_Uid.Text,
Pwd = Txt_Pwd.Text,
MemberRole = "user"

});

context.SaveChanges();
Lbl_Taeid.Visible = true;
Txt_Name.Text = string.Empty;
Txt_Family.Text = string.Empty;
Txt_Email.Text = string.Empty;
Txt_Uid.Text = string.Empty;
Txt_Pwd.Text = string.Empty;
Txt_R_Pwd.Text = string.Empty;

Txt_Name.Text = " ";
Txt_Family.Text = " ";
Txt_Email.Text = " ";
Txt_Uid.Text = " ";
}

}
}
}
}

EnKamran
جمعه 25 فروردین 1391, 15:41 عصر
متن خطا رو بنویسید لطفا

00empty00
جمعه 25 فروردین 1391, 15:55 عصر
'system.web.HttpContext' does not contain a definition for 'Tbl_Ozviat’
And no extension method 'Tbl_Ozviat’ accepting a first argument of type 'system.web.HttpContext' could be found(are you missing a using directive or an assembly reference?):اشتباه::لبخند:

ghbn1362
جمعه 25 فروردین 1391, 17:56 عصر
دوستان عزیز برای کارهای سنگین و پر بازدید نکات بسیاری باید مورد توجه قرار گیرد به عنوان مثال هیچ کاری با دیتابیس نباید در سمت سرور صورت گیرد تمامی کارهای دیتابیس باید بر عهده خود دیتابیسی باشد از Select گرفته تا Insert و Update و همین طور می بایست کشینگ داده ها در سمت دیتابیس و کد صورت گیرد تا از مراجعه پیاپی به دیتابیس جلوگیری به عمل آید همچنین سرور و نحوه تنظیم سرور نیز خودش یک بحث بسیار حرفه ای است.

00empty00
جمعه 25 فروردین 1391, 19:42 عصر
:افسرده:میشه بگید اروور برنامم برا چیه:اشتباه:

dorparasti
جمعه 25 فروردین 1391, 19:59 عصر
اشکال از نامگذاری شماست . سیستم داره httpContext رو با DbContext اشتباده می گیره و در httpContext دنبال tbl_ozviat می گرده . اسم نمونه ای که از DbContext می سازید رو به یک نام دیگه غیر از context تغییر بدید .


using (var context = new NewsDBEntities())

مثلاً رو به شکل زیر تغییر بدید


using (var currentDbContext = new NewsDBEntities())


بعد هر جا نوشتید context با currentDbContext جابجا کنید .

C#.net
جمعه 25 فروردین 1391, 20:25 عصر
اشکال از نامگذاری شماست . سیستم داره httpContext رو با DbContext اشتباده می گیره و در httpContext دنبال tbl_ozviat می گرده . اسم نمونه ای که از DbContext می سازید رو به یک نام دیگه غیر از context تغییر بدید .

کاملا درسته، جالب این جا هست که در نمونه ای هم که براتون مثال زدم context با حرف کوچک بوده، گویا شما با حرف اول بزرگ نوشتید که این خطا رخ داده!

00empty00
جمعه 25 فروردین 1391, 20:47 عصر
کاملا درسته، جالب این جا هست که در نمونه ای هم که براتون مثال زدم context با حرف کوچک بوده، گویا شما با حرف اول بزرگ نوشتید که این خطا رخ داده!
دوستان ممنون که جوابمو دادید آره حق با شما بود دیگه ارور نمیده:قلب:
اما من دوباره رسیدم به مشکل اولم که سیو نکردن اطلاعات وارد شده تو تکس باکسام بود.
برنامم رو سیوچنج متوقف میشه:ناراحت: