افزایش سرعت و کارایی برنامه نویسی در شرپوینت ( بخش دوم )

 

با سلام

در این مقاله ادامه مبحث قبل در مورد سرعت و کارایی برنامه نویسی در شرپوینت را مورد بررسی قرار میدهیم .

۴ – استفاده از Paging در جستجو ها

همانطور که
میدانید لیست های شرپوینت میتوانند هزاران آیتم را ذخیره نمایند ، اما همه
ما شنیدیم که برای اینکه کارایی لیست در بهترین شرایط باشد تعداد آیتم ها
نباید از ۲۰۰۰ بیشتر باشد . وقتی که تعداد این آیتم ها از این حدود تجاوز
میکند کارایی پایین میاد و برای اینکه بتونیم بهترین بهروری را داشته باشیم
میتونیم از تکنیک ایندکس کردن ستون ها و نماها استفاده کنیم .

در کنار رعایت
کردن این موارد خیلی مهمه که در هنگام دسترسی به داده ها نیز مواردی را
رعایت کنیم تا کارایی را در برنامه خود افزایش بدیم ، همانطور که قبلا نیز
اشاره شد دسترسی به داده هایی که شما نیاز دارید بار نسبتا سنگینی را بر
دیتابیس می گذارد ، اما خوشبختانه در مدل شی گرا شرپوینت امکاناتی فراهم
شده است تا بتوانید این موارد را به خوبی برطرف کنید .

صفحه بندی کردن
اطلاعات یا Paging یک تکنیک بسیار خوبی است که در نرم افزارهای کلاینت و
وب استفاده می شود ، مثل کنترل GridView که با صفحه بندی کردن اطلاعات
پیمایش اطلاعات را برای کاربران آسان تر می کند که اگر به درستی پیاده
سازی بشود بار اضافی بر روی دیتابیس را کاهش می دهد .

کلاس SPQuery
مشخصه ای بنام ListItemCollectionPosition دارد که این امکان را برای شما
فراهم میکند تا صفحه ی آغازین را مشخص کنید و همانطور که قبلا نیز گفته شد
RowLimit مشخص میکند که در هر صفحه چند آیتم نمایش داده شود ، بیایید با
هم نگاهی به یک مثال بیاندازیم :

SPQuery query = new SPQuery();

query.RowLimit = 10; // that is our page size

do

{

SPListItemCollection items = SPContext.Current.List.GetItems(query);

// do something with the page result

// set the position cursor for the next iteration

query.ListItemCollectionPosition = items.ListItemCollectionPosition;

} while (query.ListItemCollectionPosition != null)

List.GetItems هر
بار با گرفتن Query فقط ۱۰ آیتم به ما ارائه می کند و
ListItemCollectionPosition همانند یک اشاره گر عمل کرده و صفحه بعدی که
باید اجرا شود را در خود نگهداری میکند ، در شکل زیر میتوانید فعالیت های
دیتابیس را ملاحظه کنید :

image 1

و اگر نگاه دقیق تری به دستورات SQL بیاندازیم میبینیم که آیتم ها از صفحه معین شده فیلتر می شوند :

۵ – بروز رسانی تعداد زیادی آیتم

در مورد قبلی در
مورد بهترین نحوه دسترسی به اطلاعات صحبت کردیم و حالا میخواهیم در مورد
بهترین نحوه بروز رسانی آیتم ها را مورد بررسی قرار دهیم .برای اضافه کردن
یا بروز رسانی آیتم ها راه های متفاوتی وجود دارد ، به طور مثال برای بروز
رسانی از SPlistItem.Update و برای اضافه کردن آیتم از
SPListItemCollection.Add استفاده میکنیم ، به طور مثال :

for (int itemIx = 0; itemIx < 100; itemIx++)

{

SPListItem newItem = items.Add();

// fill all the individual fields with values

newItem.Update();

}

اگر نگاه دقیقی به
کدهایمان بنداریم متوجه خواهیم شد که با هر بار اجرا شدن متد Update یک
متد داخلی به اسم SPListItem.AddOrUpdateItem نیز اجرا می شود که یک
stored procedure برای انجام این عملیات را صدا میزند .

در این مثال اضافه کردن ۱۰۰ آیتم به یک لیست ۴٫۵ ثانیه طول می کشد .

اگر شما احتیاج
دارید تا تعداد زیادی آیتم را بروز رسانی کنید بهتر است به جای استفاده از
متد Update از تابعی به نام ProcessBatchData که توسط کلاس SPWeb قابل
دسترسی می باشد استفاده کنید .

ProcessBatchData متدی که با فرمت XML ساخته می شود را اجرا میکند ( در این مقاله میتوانید توضیحات بیشتری در این ضمینه کسب کنید ) ، نگاهی به مثال زیر بیاندازید :

StringBuilder query = new StringBuilder();

for (int itemIx=0;itemIx<100;itemIx++) {

query.AppendFormat("<Method ID=\"{0}\">" +

"<SetList>{1}</SetList>" +

"<SetVar Name=\"ID\">New</SetVar>" +

"<SetVar Name=\"Cmd\">Save</SetVar>" +

"<SetVar Name=\"{3}Title\">{2}</SetVar>" +

"</Method>", itemIx, listGuid, someValue, "urn:schemas-microsoft-com:office:office#");

}

SPContext.Current.Web.ProcessBatchData(string.Format(

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +

"<ows:Batch OnError=\"Return\">{0}</ows:Batch>", query.ToString()));

پس از اجرای این کد و مقایسه آن به روش قبلی میتوانید متوجه شوید که تقریبا ۲ ثانیه اختلاف وجود دارد :

استفاده از این
روش برای به روز رسانی تعداد زیادی آیتم بسیار مناسب می باشد ولی در هنگام
استفاده از این روش باید نکات زیر را رعایت کنید :

– حتما از StringBuilder استفاده کنید نه String .

– فراخوانی ها را به قطعات کوچک تر تقسیم کنید تا با خطای حافظه مواجه نشوید .

– به عنوان پیشنهاد دیگر شما میتوانید از متد UpdateListItems وب سرویس نیز استفاده کنید .

 

۶ – کدام لیست ها کند هستند ، چرا از آنها استفاده میکنیم و چرا کند هستند ؟

همانطور که
میدانیم کارایی لیست ها با بالا رفتن تعداد آیتم ها کاهش می یابد ، در
بیشتر سایت ها و بلاگ ها صحبت از ۲۰۰۰ آیتم میباشد اما این تعداد آیتم
مشکل اصلی ما نمی باشد ، در حالت عادی شما میتوانید بیشتر از این هم آیتم
در لیست ذخیره کنید ، همه ی اینها بستگی به این دارد که چطور این لیست ها
نمایش پیدا میکنند .

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

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

راه های زیادی
برای بررسی عملکرد و نحوه دسترسی به داده ها در شرپوینت وجود دارد ، شما
میتوانید از فایل های IIS Logs استفاده کنید ( برای اطلاعات بیشتر این مقاله را مطالعه کنید ) یا از SharePoint Usage Reporting Feature استفاده کنید .

بهترین راه برای
مانیتور کردن کارایی لیست ها آنالیز زمان پاسخ دهی HTTP به آدرس لیست و
نما ها میباشد . آدرس یک لیست شرپوینت فرمتی به صورت زیر دارد :

http://servername/site/{LISTNAME}/{VIEWNAME}.aspx.

شما میتوانید توسط ابزار های مختلفی به آنالیز این زمان بپردازید ، در اینجا ما از ابزار Business Transaction محصول شرکت DynaTrace  استفاده می کنیم ، در شکل زیر میتوانید نمایی از این سناریو را ملاحظه کنید :

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

ما میتوانیم این
کار را توسط کلاس های شرپوینت مثل SPList  ، SPView  یا
SPRequest.RenderViewAsHtml انجام بدیم . شکل زیر آنالیز لیست با استفاده
از متد SPRequest  را نمایش می دهد :

در شکل بالا به ما
شناسه یکتای لیست نمایش داده شده ، هر لیست و نما در شرپوینت دارای یک
شناسه یکتا از نوع GUID  است . راه های زیادی برای بدست آوردن نام لیست
وجود دارد ، به طور مثال شما میتوانید با قراردادن شناسه لیست در آدرس بار
و رفتن به تنظیمات لیست نام آن را بدست آورید :

http://servername/_layouts/listedit.aspx?List={GUID}

با مشخص شدن لیست
ها و نماهایی که دسترسی به آنها بیشتر است میتوانیم مواردی که باعث کاهش
کارایی می شوند را بررسی و مشکلات مربوط به آنها را برطرف کنیم . مواردی
که باعث کند شدن لیست ها می شوند اغلب شامل موارد زیر است :

– تعداد زیادی آیتم در نمای لیست ها نمایش داده شود .

– بالا بودن تعداد آیتم ها بدون داشتن فیلترگذاری و ایندکس کردن ستون ها

– دسترسی نادرست به داده ها از طریق وب پارت

مدل شی گرا
شرپوینت امکانات بسیار زیادی را برای توسعه دهندگان فراهم کرده است تا
بتوانند تغییرات مورد نظر را در محیط شرپوینت  اعمال کنند و برای این کار
راه های بسیار زیادی را در اختیار شما قرار داده است اما بسیار مهم است که
هنگام پیاده سازی نرم افزارهای مبتنی بر شرپوینت کارایی آن را نیز مدنظر
داشته باشید .

امیدوارم که این مطلب مورد استفاده شما عزیزان قرار گرفته باشد .

موفق و پیروز باشید .

منبع : http://www.infoq.com

پاسخ دهید